Build CAP Application on Kyma ¶
This is the memo of self-practice following the tutorials from Deploy Your CAP Application on SAP BTP Kyma Runtime.
Prerequisites:
- Register account in Developer@SAP.
- Register trial account in SAP BTP.
Tasks:
- Configure Kyma in SAP Business Technology Platform (SAP BTP) subaccount and prepare Kyma development environment.
- Create an HDI container for an SAP HANA Cloud instance on Cloud Foundry and create credentials for this SAP HANA cloud instance in Kyma cluster.
- Develop a business application using SAP Cloud Application Programming Model (CAP).
- Start on local environment, enhance it with an SAP Fiori UI, add business logic to it, and also roles and authorization check.
- Add a Helm chart to the application, build docker images, push them to your container registry, and deploy your application to your Kyma cluster on SAP BTP.
Local environment:
- Applel Silicon M1 chipset
- macOS 12.6 (command
sw_vers) - Nodejs version:
- CDS version:
- jq - for JSON processing in CLI (
brew install jq)
SAP BTP subaccount configuration ¶
For the SAP BTP free tier, the recommendation is as well to use an AWS-based subaccount. Kyma runtime in the free tier is only available on AWS.
Choose the entitlements for the subdomain:
- Alert Notification: Standard plan
- Continuous Integration & Delivery: default (Application) or the trial (Application) or free (Application) plans which are not charged
- Kyma runtime: any available plan in the list (trial and free are not charged)
- Launchpad Service: standard (Application) or free (Application)
- SAP HANA Cloud: hana
- SAP HANA Schemas & HDI Containers: hdi-shared
Set up local BTP environment ¶
Here we will use btp command to set up cloud environment. Details we can refer to help document Working with Environments Using the btp CLI.
Download BTP CLI package btp-cli-darwin-amd64-<ver_num>.tar.gz via link and unpackage it.
A new subfolder darwin-amd64 will be created in current path and a bin file btp is under the subfolder. Move file btp to folder /usr/local/bin/.
Log on to the subaccount on BTP.
btp login --url https://cpcli.cf.eu10.hana.ondemand.com --subdomain <your_subdomain> --user <your_registered_email_address>
Configuration file was stored at /Users/$USER/Library/Application Support/.btp/config.json. In Linux, the configuration file is on /home/$USER/.config/.btp/config.json. We can get current user via command echo $USER.
Tips:
- Commands are executed in the target, unless specified otherwise using a parameter. To change the target, use
btp target. - For an explanation of the targeting mechanism, use
btp help target.
Get the subaccount ID in BTP and we will know that kyma and cloundfoundry are available in current trial account.
Get details about an environment available for a subaccount
btp get accounts/available-environment --subaccount <your_subaccount_id> --environment cloudfoundry --service cloudfoundry --plan standard
btp get accounts/available-environment --subaccount <your_subaccount_id> --environment kyma --service kymaruntime --plan trial
Get status running instances. Here we will also get environment ID of running instances.
Delete a running instance if needed.
Create Kyma instance.
btp create accounts/environment-instance --subaccount <your_subaccount_id> --environment kyma --service kymaruntime --plan trial --parameters '{"name": "<your_kyma_instance_name>"}'
btp get accounts/environment-instance <environment_ID> --subaccount <your_subaccount_id>
Create CloudFoundry instance
btp create accounts/environment-instance --subaccount <your_subaccount_id> --environment cloudfoundry --service cloudfoundry --plan standard --parameters '{"instance_name": "<your_cf_instance_name>"}'
btp get accounts/environment-instance <environment_ID> --subaccount <your_subaccount_id>
Log onto CF to create space DEV by providing API endpoint, Email and Password, which are ready in the subaccount overview page.
Install Homebrew ¶
Refer to installation guide.
Set environment variables
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git"
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-core.git"
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles"
Install Homebrew
Add below in file ~/.zprofile.
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git"
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-core.git"
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles"
eval "$(/opt/homebrew/bin/brew shellenv)"
Make it effected.
Install kubetcl ¶
The kubectl installation guide
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/arm64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
sudo chown root: /usr/local/bin/kubectl
kubectl version --client
Install plugin oidc-login.
curl -fsSLO https://github.com/kubernetes-sigs/krew/releases/latest/download/krew-darwin_arm64.tar.gz
tar xvf krew-darwin_arm64.tar.gz
./krew-darwin_arm64 install krew
Add the $HOME/.krew/bin directory to the PATH environment variable by updating ~/.zprofile.
Make it effected
Run kubectl krew to check the installation.
Install/uninstall plugin oidc-login.
SAP Kyma runtime ¶
In the Overview area of your subaccount open the Link to dashboard link which appears next to the Console URL under the Kyma Environment area. At the top left of the window choose the Clusters Overview drop down and choose your cluster. In the Clusters Overview window choose the Download Kubeconfig for your Kyma runtime to download your KUBECONFIG.
Add below to ~/.zprofile to set the kubeconfig to an environment variable.
Make above change effected.
Test connection between kubectl and Kyma on BTP.
Install Node.js ¶
Refer to installation guide
Install SQLite ¶
Install SQLite via brew.
Add below to ~/.zprofile
Make it effected
Install Xcode ¶
(For macOS) We have to install Command-Line Tools for Xcode, cause some node modules need binary modules (node-gyp).
Install Git ¶
Refer to installation guide.
Install SAPUI5 ¶
Install the UI5 CLI.
Install CF CLI ¶
Refer to installation guide.
Install CAP Tooling ¶
See the details in the CAP documentation.
npm search --global @sap/cds-dk
npm install --global @sap/cds-dk
npm list --global @sap/cds-dk
cds --version
Install VSCode ¶
In VS Code, invoke the Command Palette ( View → Command Palette or ⇧⌘P) and type shell command to find the Shell Command: Install 'code' command in PATH.
Install SAP CDS Language Support extension.
Install SAP Fiori tools - Extension Pack extension.
Install Yeoman ¶
Yeoman is a tool for scaffolding web apps. You’ll need it if you want to carry out the tutorial Add the SAP Launchpad Service.
Install Docker ¶
Install Helm ¶
Refer to installation guide
Install Paketo(pack) ¶
Refer to installation guide.
Install Rancher Desktop ¶
Download the Rancher Desktop installer for macOS from the release page. Refer to installation guide.
Download tutorial ¶
Go to tutorial root directory and clone the code.
Initialize the project ¶
Install required Node.js modules in the app directory cpapp.
Add files to the project ¶
Copy the file schema.cds from templates/create-cap-application/db to the db folder of the app. It creates two entities in the namespace sap.ui.riskmanagement: Risks and Mitigations.
Copy the file risk-service.cds from templates/create-cap-application/srv to the srv folder of the app. It creates a new service RiskService in the namespace sap.ui.riskmanagement. This service exposes two entities: Risks and Mitigations, which are exposing the entities of the database schema we've created in the step before.
Copy the folder data from templates/create-cap-application/db to the db folder of the app. There are two comma-separated value (CSV) files that contain local data for both the Risks and the Mitigations entities.
Use Fiori Application Generator (VSCode extension) to generate Risk UI with Fiori element template. The generation will create a risks and a webapp folder with a Component.js file in the app folder of the project.
Copy the file risks-service-ui.cds from templates/create-ui-fiori-elements/srv to the srv folder of the app. It defines annotations to show a work list with some columns and the data from the service in the Risk UI.
Edit app/risks/webapp/manifest.json file to make the header fields editable, that is, shows title and description in Risk UI.
Copy the file risk-service.js from templates/cap-business-logic/srvto the srv folder of the app. It now shows the work list in Risk UI with the columns Priority and Impact with color and an icon, depending on the amount in Impact.
Use Fiori Application Generator (VSCode extension) to generate Migration UI with Fiori free-style template. The generation will create a migrations and a webapp folder with a Component.js file in the app folder of the project.
Update file cpapp/app/mitigations/webapp/view/Worklist.view.xml to show Description, Owner, and Timeline columns, as well as in detail object page.
Till now, our risks and mitigations application have been generated by the SAP Fiori Tools Generator and can be started independently. They are launched without a launch page.
Copy the file launchpage.html from templates/launchpage/app to the app folder of the app. There are two applications in the launch page with URLs that point to the respective apps. We now see the Mitigations app next to the Risks app on the launch page.
Open the file srv/risk-service.cds and add role restrictions to entities.
Copy the file templates/cap-roles/.cdsrc.json to the project directory cpapp. The file defines two users risk.viewer@tester.sap.com and risk.manager@tester.sap.com. The default password can be found in the file .cdsrc.json.
We will see the CAP server to show above applications via link http://localhost:4004.
Prepare Kyma Development Environment ¶
Execute cds version to make sure the package.json is using @sap/cds 6.0.1 or newer and we have @sap/cds-dk 6.0.1 or newer globally installed.
Create namespace on Kyma.
Switch to the namespace.
Create container registry secret.
Copy the folder scripts from templates/Kyma-Prepare-Dev-Environment to the project root folder cpapp.
In the root folder cpapp of the project, run the script to create the secret.
Need provide below input:
docker-server=https://registry-1.docker.io
docker-username=<your_registered_docker_username>
docker-email=<your_registered_docker_email>
docker-password=<your_api_token>
Verify
Set Up SAP HANA Cloud for Kyma ¶
Add SAP HANA support to your project. This adds the db module for SAP HANA access to the package.json file. Execute the command below in the project root directory cpapp.
Verify the access to both CF and Kyma by executing below commands.
Create HANA Cloud instance cpapp-db in CloudFoundry DEV namespace. The admin user id is DBADMIN.
In the root folder cpapp of the project, execute:
Get the host name pattern of the cluster with the following command. Result looks like *.c-<xyz123>.sap.kyma.ondemand.com.
The script will:
- Create service key
cpapp-db-keyfor HANA Cloud service instancecpapp-dbas<your_btp_registered_email>. - Create Kubernetes secret
cpapp-dbfor HANA DB instance. View it usingkubectl get secret cpapp-db -o yaml.
User Authentication and Authorization (XSUAA) Setup ¶
Set up XSUAA.
Above command will do:
- Adds the XSUAA service to the
package.jsonfile of the project - Creates the XSUAA security configuration
xs-security.jsonfor the project
Add Helm Chart ¶
Add Helm Chart.
Get docker server URL by command:
Get the image pull secret for container registry. In the demo, it's container-registry.
Get the host name pattern of the cluster.
Open the file chart/values.yaml:
- Replace the placeholder
<your-container-registry>with docker server URLhttps://docker.io/. - Set
imagePullSecretwith valuename: container-registry. - Add host name of the cluster without leading
*.. - Add the binding
dbpointing to the SAP HANA Cloud instance secretcpapp-db. - Point the binding
hanaof the SAP HANA Cloud instance secretcpapp-db. - Add the Authorization and Trust Management service to allow user login.
Deploy CAP Application to Kyma ¶
Build docker image.
CONTAINER_REGISTRY=https://index.docker.io/v1
CONTAINER_REGISTRY=https://registry-1.docker.io/yuhuihu
CONTAINER_REGISTRY=yuhuihu
CAP build.
Build CAP service.