Tiven Wang
Wang Tiven May 25, 2019
425 favorite favorites
bookmark bookmark
share share

本系列文章我们将介绍如何在 SAP Cloud Foundry Platform 上进行 HANA XSA 模式的程序开发。 上一篇 SAP Cloud Foundry XSA - Getting Started 我们创建了一个 MTA 项目,并成功创建和访问了 HANA Database 的数据,这一篇我们介绍介绍如何在 MTA 项目中开发 SAPUI5 前端和使用 UAA 服务做权限管理。本篇的项目代码可下载自 gitlab.com/i.tiven.wang/sap-cf-xsa-demo .

环境:

  • SAP Cloud Platform Trial
    • Cloud Foundry Trial
    • Neo Trial

SAP Help:

Step 1. Create HTML5 Module

on Project -> New -> HTML5 Module 选择模板类型为 SAPUI5 Application

命名为 web ,完成后可以测试一下, on web -> Run -> Run as Web Application -> index.html 可以打开一个只有 Title 的 UI5 页面便证明成功了。

Step 2. UAA Service

在生成 mta 配置文件里的 web app 的 Requires 属性里可以看到两个资源一个 uaa 另一个 destination 都已经配置。

Create Service Manually

如果有的情况下没有自动创建的资源则可以手工创建,如在 SAP Cloud Foundry Platform -> Services -> Authorization & Trust Management -> Instances 里创建一个 UAA 服务实例,Plan 选择 application . 或者使用 CF CLI 进行创建。

$ cf create-service xsuaa application UAA-service
Creating service instance UAA-service in org P2001285375trial_trial / space dev as i.tiven.wang@gmail.com...
OK

Before you can establish a dependency between your HTML5 module and the UAA service instance you created in the previous step, you need to list the UAA service instance as a resource in your applications. For example:

resources:
  - name: uaa_sap-cf-xsa-demo
    parameters:
      path: ./xs-security.json
      service-plan: application
      service: xsuaa
    type: org.cloudfoundry.managed-service

Enable UAA for XSJS

前端 web 自动创建了 uaa 服务进行了权限限制,那么我们用此 uaa 服务再对后端的 core_xsjs 服务进行权限控制,为 core xsjs 配置如下

然后还要在 xsjs 程序主入口文件 server.js 里的 xsjs 配置选项中把 anonymous : true 注释掉,就会使用能找到的 xsuaa 服务对权限进行控制。并增加配置 xsApplicationUser: false 防止 Application Session User 设置给 XS User 带给 HANA DB

Step 3. Route and Destinations

要使前端 App (web) 访问后端 App (core_xsjs) 我们还得为前端 App 配置依赖和 Router,对后端的依赖配置如下图

然后还要在 web/xs-app.json 中增加路由配置如下

{
  "welcomeFile": "/web/index.html",
  "authenticationMethod": "route",
  "logout": {
    "logoutEndpoint": "/do/logout"
  },
  "routes": [
    {
      "source": "^/web/(.*)$",
      "target": "$1",
      "localDir": "webapp"
    },
    {
      "source": "(.*)(.xsodata)",
      "destination": "core-xsjs-backend",
      "authenticationType": "xsuaa"
    },
    {
      "source": "(.*)(.xsjs)",
      "destination": "core-xsjs-backend",
      "authenticationType": "xsuaa"
    }
  ]
}

Step 4. Consume the OData service

以上配好之后就可以编写代码对后端的 APIs 进行访问了

onInit: function () {
  var oModel = new sap.ui.model.odata.ODataModel("/xsodata/purchaseOrder.xsodata", true);
  this.getView().setModel(oModel);
}
<Table id="idProductsTable" inset="false" items="{
    path: '/POHeader',
    sorter: {
      path: 'PURCHASEORDERID'
    }
  }">

Step 5. Run on Cloud Foundry

UI5 App 默认是 Run on Neo 环境的,可以在 Run Configurations 里改成 Run on Cloud Foundry,此则会部署到 SAP Cloud Foundry 真实环境进行运行

打开链接后由于 uaa 服务的作用,页面会跳到授权页面进行登录验证

并且在 SAP Cloud Foundry 平台可以看到两个服务实例已经被创建

别忘记 core_xsjs App 有更改,要重新 Build ,即重新部署到 SAP Cloud Foundry Platform

Step 6. Deploy

在这之前都是执行的测试过程,要真正部署到 Productive 环境则需要单独的 Deploy 动作。

  1. on Project -> Build -> Build

  2. on The mtar file -> Deploy -> Deploy to SAP Cloud Platform 自动选择 Cloud Foundry space 进行部署

成功后就可以在 SAP Cloud Platform Cockpit 里看到部署的应用们了,每个应用里都可以看到自己的对应的链接

Deploy Errors

我遇到的错误,Deploy 时出错:because of: The container “DB” already exists

######com.sap.cloud.lm.sl.cf.persistence.services.ProcessLogger########flowable-async-job-executor-thread-8###
[CreateServiceStep] Last operation for service "hdi_db": {
  "type": "CREATE",
  "description": "Failed to create HDI container on database \u00274e7659f0-cbae-4064-afb7-12f9d2b21ec8:trialdb01\u0027 (10.253.93.93:30041), because of: Call to HANA DI failed, requestId 740038, because of: Creating the container \"DB\"... failed (8214129), because of: Could not create the container \"DB\" (8211042), because of: Could not create the DTC \"DB\" (8211011), because of: The container \"DB\" already exists (8211040), because of: Database error 301: : unique constraint violated: Table(CONTAINERS_) (8201003)",
  "state": "FAILED"
}#

因为本来的配置是这样的, hdi-container 配置了 Schema 参数(因为之前创建 HDI 时的 Schema Name 有填写)

resources:
  - name: hdi_db
    parameters:
      config:
        schema: DB
    properties:
      hdi-container-name: '${service-name}'
    type: com.sap.xs.hdi-container

所以在 New HANA Database Module 章节里的 NamespaceSchema Name 字段都要清空,不需要填写(现已改正)。现配置如下

resources:
  - name: hdi_db
    properties:
      hdi-container-name: '${service-name}'
    type: com.sap.xs.hdi-container

再次 Deploy 就成功了。

Step 7. Undeploy DB Artifacts

在开发过程中很可能需要更改或者删除数据库对象,那么对于新增和修改操作,XSA 会自动计算代码和数据库之间的差异并进行同步。但对于删除操作 XSA 不会自动进行删除数据库对象,需要手动设置一个 Whitelist 说明需要删除的数据库对象。

db 下创建一个文件 undeploy.json 里面列举不需要的文件(并且要把文件删掉),如下

[
  "src/data/PurchaseOrder.hdbcds"
]

这样重新 Build 后数据库对象就会被删除。

Step 8. Commit Code

最后别忘了提交代码,养成良好的习惯。

Next Steps

SAP Cloud Foundry XSA - MultiApps

Similar Posts

Comments

Back to Top