From e183b7fd6a07e3f2beffef93c1ef7cebb23e930f Mon Sep 17 00:00:00 2001 From: Tania Kapoor Date: Tue, 30 Nov 2021 18:33:13 +0530 Subject: [PATCH] SBO updates for OCP 4.9 from P and Z --- _topic_maps/_topic_map.yml | 2 + ...-with-service-binding-ibm-power-ibm-z.adoc | 37 ++++++ images/img_power.png | Bin 0 -> 54102 bytes ...o-postgresql-database-service-power-z.adoc | 116 ++++++++++++++++++ ...-postgresql-database-instance-power-z.adoc | 96 +++++++++++++++ ...-postgresql-database-operator-power-z.adoc | 78 ++++++++++++ ...-petclinic-sample-application-power-z.adoc | 115 +++++++++++++++++ 7 files changed, 444 insertions(+) create mode 100644 applications/connecting_applications_to_services/getting-started-with-service-binding-ibm-power-ibm-z.adoc create mode 100644 images/img_power.png create mode 100644 modules/sbo-connecting-spring-petclinic-sample-app-to-postgresql-database-service-power-z.adoc create mode 100644 modules/sbo-creating-a-postgresql-database-instance-power-z.adoc create mode 100644 modules/sbo-deploying-a-postgresql-database-operator-power-z.adoc create mode 100644 modules/sbo-deploying-the-spring-petclinic-sample-application-power-z.adoc diff --git a/_topic_maps/_topic_map.yml b/_topic_maps/_topic_map.yml index f8ea8375f9..66ace1f4a7 100644 --- a/_topic_maps/_topic_map.yml +++ b/_topic_maps/_topic_map.yml @@ -1573,6 +1573,8 @@ Topics: File: installing-sbo - Name: Getting started with service binding File: getting-started-with-service-binding + - Name: Getting started with service binding on IBM Power Systems, IBM Z, and LinuxONE + File: getting-started-with-service-binding-ibm-power-ibm-z - Name: Exposing binding data from a service File: exposing-binding-data-from-a-service - Name: Projecting binding data diff --git a/applications/connecting_applications_to_services/getting-started-with-service-binding-ibm-power-ibm-z.adoc b/applications/connecting_applications_to_services/getting-started-with-service-binding-ibm-power-ibm-z.adoc new file mode 100644 index 0000000000..bb33f7f2c4 --- /dev/null +++ b/applications/connecting_applications_to_services/getting-started-with-service-binding-ibm-power-ibm-z.adoc @@ -0,0 +1,37 @@ +[id="getting-started-with-service-binding-ibm-power-ibm-z"] += Getting started with service binding on IBM Power Systems, IBM Z, and LinuxONE +include::modules/common-attributes.adoc[] +include::modules/servicebinding-document-attributes.adoc[] +:context: getting-started-with-service-binding-ibm-power-ibm-z + +toc::[] + +The {servicebinding-title} manages the data plane for workloads and backing services. This guide provides instructions with examples to help you create a database instance, deploy an application, and use the {servicebinding-title} to create a binding connection between the application and the database service. + +// Prerequisites for getting started with Service Binding Operator +[discrete] +== Prerequisites + +* You have access to an {product-title} cluster using an account with `cluster-admin` permissions. +* You have installed the `oc` CLI. +* You have installed PostgreSQL `psql` CLI. +* You have installed the {servicebinding-title} from OperatorHub. + +//Deploying PostgreSQL operator +include::modules/sbo-deploying-a-postgresql-database-operator-power-z.adoc[leveloffset=+1] + +//Creating a PostgreSQL database instance +include::modules/sbo-creating-a-postgresql-database-instance-power-z.adoc[leveloffset=+1] + +//Deploying the Spring PetClinic sample application +include::modules/sbo-deploying-the-spring-petclinic-sample-application-power-z.adoc[leveloffset=+1] + +//Connecting the Spring PetClinic sample application to the PostgreSQL database service +include::modules/sbo-connecting-spring-petclinic-sample-app-to-postgresql-database-service-power-z.adoc[leveloffset=+1] + +[id="additional-resources_getting-started-with-service-binding-ibm-power-ibm-z"] + +== Additional Resources +* xref:../../applications/connecting_applications_to_services/installing-sbo.adoc#installing-sbo[Installing Service Binding Operator] +* xref:../../applications/creating_applications/odc-creating-applications-using-developer-perspective.adoc#odc-creating-applications-using-developer-perspective[Creating applications using the Developer perspective] +* xref:../../operators/understanding/crds/crd-managing-resources-from-crds.adoc[Managing resources from custom resource definitions] \ No newline at end of file diff --git a/images/img_power.png b/images/img_power.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb97db9e5783de65e57bed65c968207d252d465 GIT binary patch literal 54102 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 R&8*jhjkw>}qm*!r{$DGj%*g-% literal 0 HcmV?d00001 diff --git a/modules/sbo-connecting-spring-petclinic-sample-app-to-postgresql-database-service-power-z.adoc b/modules/sbo-connecting-spring-petclinic-sample-app-to-postgresql-database-service-power-z.adoc new file mode 100644 index 0000000000..f5081d52b7 --- /dev/null +++ b/modules/sbo-connecting-spring-petclinic-sample-app-to-postgresql-database-service-power-z.adoc @@ -0,0 +1,116 @@ +[id="sbo-connecting-spring-petclinic-sample-app-to-postgresql-database-service-ibm-power-z_{context}"] += Connecting the Spring PetClinic sample application to the PostgreSQL database service + +To connect the sample application to the database service, you must create a `ServiceBinding` custom resource (CR) that triggers the {servicebinding-title} to project the binding data into the application. + +[discrete] +.Procedure + +. Create a `ServiceBinding` CR to project the binding data: ++ +[source,terminal] +---- +$ oc apply -f - << EOD +--- +apiVersion: binding.operators.coreos.com/v1alpha1 +kind: ServiceBinding +metadata: + name: spring-petclinic-rest + namespace: my-postgresql +spec: + services: <1> + - group: postgresql.dev4devs.com + version: v1beta1 + kind: Database <2> + name: sampledatabase + version: v1alpha1 + application: <3> + name: spring-petclinic-rest + group: apps + version: v1 + resource: deployments +EOD +---- +<1> Specifies a list of service resources. +<2> The CR of the database. +<3> The sample application that points to a Deployment or any other similar resource with an embedded PodSpec. ++ +The output verifies that the `ServiceBinding` CR is created to project the binding data into the sample application. ++ +.Example output +[source,terminal] +---- +servicebinding.binding.operators.coreos.com/spring-petclinic-rest created +---- + +. To verify that the binding is successful, check the status conditions of the binding resource: ++ +[source,terminal] +---- +$ oc get servicebindings spring-petclinic-rest -n my-postgresql -o jsonpath-as-json='{.status.conditions}' +---- ++ +.Example output +[source,terminal] +---- +[ + [ + { + "lastTransitionTime": "2021-09-06T13:42:28Z", + "message": "", + "reason": "DataCollected", + "status": "True", + "type": "CollectionReady", + }, + { + "lastTransitionTime": "2021-09-06T13:42:28Z", + "message": "", + "reason": "ApplicationUpdated", + "status": "True", + "type": "InjectionReady", + }, + { + "lastTransitionTime": "2021-09-06T13:42:28Z", + "message": "", + "reason": "ApplicationsBound", + "status": "True", + "type": "Ready", + }, + ], +] +---- ++ +By default, the values from the binding data of the database service are projected as files into the workload container that runs the sample application. + +. Once this is created, you can go to the topology to see the visual connection. ++ +.Connecting spring-petclinic-rest to sampledatabase +image::img_power.png[] + +. Set up the port forwarding from the application port to access the sample application from your local environment: ++ +[source,terminal] +---- +$ oc port-forward --address 0.0.0.0 svc/spring-petclinic-rest 9966:80 -n my-postgresql +---- + +. Access link:http://localhost:9966/petclinic[http://localhost:9966/petclinic]. ++ +You can now remotely access the Spring PetClinic sample application at localhost:9966. + +. To verify that the application is now connected to the database service, access the list of all pets: ++ +[source,terminal] +---- +$ curl -X GET "http://localhost:9966/petclinic/api/pets" -H "accept: application/json" +---- ++ +.Example output +[source,terminal] +---- +[{"id":1,"name":"Leo","birthDate":"2000/09/07","type":{"id":1,"name":"cat"}, +"owner":{"id":1,"firstName":"George","lastName":"Franklin","address":"110... +---- ++ +The previous output shows the initially configured sample data and verifies that the application is now connected to the database service. + diff --git a/modules/sbo-creating-a-postgresql-database-instance-power-z.adoc b/modules/sbo-creating-a-postgresql-database-instance-power-z.adoc new file mode 100644 index 0000000000..e03bcbe9dd --- /dev/null +++ b/modules/sbo-creating-a-postgresql-database-instance-power-z.adoc @@ -0,0 +1,96 @@ +[id="sbo-creating-a-postgresql-database-instance-power-z_{context}"] += Creating a PostgreSQL database instance + +To create a PostgreSQL database instance, you must create a `Database` custom resource (CR) and configure the database. + +.Procedure + +. Create the `Database` CR and the `my-postgresql` namespace by running the following command in shell: ++ +[source,terminal] +---- +$ oc apply -f - << EOD +apiVersion: postgresql.dev4devs.com/v1alpha1 +kind: Database +metadata: + name: sampledatabase + namespace: my-postgresql + annotations: + host: sampledatabase + type: postgresql + port: "5432" + service.binding/database: 'path={.spec.databaseName}' + service.binding/port: 'path={.metadata.annotations.port}' + service.binding/password: 'path={.spec.databasePassword}' + service.binding/username: 'path={.spec.databaseUser}' + service.binding/type: 'path={.metadata.annotations.type}' + service.binding/host: 'path={.metadata.annotations.host}' +spec: + databaseCpu: 30m + databaseCpuLimit: 60m + databaseMemoryLimit: 512Mi + databaseMemoryRequest: 128Mi + databaseName: "sampledb" + databaseNameKeyEnvVar: POSTGRESQL_DATABASE + databasePassword: "samplepwd" + databasePasswordKeyEnvVar: POSTGRESQL_PASSWORD + databaseStorageRequest: 1Gi + databaseUser: "sampleuser" + databaseUserKeyEnvVar: POSTGRESQL_USER + image: registry.redhat.io/rhel8/postgresql-96:latest + databaseStorageClassName: nfs-storage-provisioner + size: 1 +EOD +---- ++ +The annotations added in this `Database` CR enable the service binding connection and trigger the Operator reconciliation. ++ +The output verifies that the database instance is created: ++ +.Example output +[source,terminal] +---- +database.postgresql.dev4devs.com/sampledatabase created +---- + +. After you have created the database instance, ensure that all the pods in the `my-postgresql` namespace are running (it will take a few minutes): ++ +[source,terminal] +---- +$ oc get pods -n my-postgresql +---- ++ +The output verifies that the database is created: ++ +.Example output +[source,terminal] +---- +NAME READY STATUS RESTARTS AGE +sampledatabase-cbc655488-74kss 0/1 Running 0 32s +---- ++ + +The new database is empty at this stage. You can set its schema and project a sample data set to interact with the sample application. + +. Initialize the database with the schema and sample data. To do so, use the following custom shell script by copying the code into the shell and running it: ++ +[source,terminal] +---- +$ cat << EOD | bash +#!/bin/bash + +export pgo_cluster_name=sampledb +export cluster_namespace=my-postgresql +export pgo_cluster_username=sampleuser +nohup oc -n "\${cluster_namespace}" port-forward svc/sampledatabase 5432:5432 & +sleep 5 +curl -LO https://raw.githubusercontent.com/spring-petclinic/spring-petclinic-rest/master/src/main/resources/db/postgresql/initDB.sql +psql -h localhost -U "\${pgo_cluster_username}" "\${pgo_cluster_name}" -f initDB.sql +curl -LO https://raw.githubusercontent.com/spring-petclinic/spring-petclinic-rest/master/src/main/resources/db/postgresql/populateDB.sql +psql -h localhost -U "\${pgo_cluster_username}" "\${pgo_cluster_name}" -f populateDB.sql +EOD +---- + +The output in the terminal shows you that the database is being configured for the application. + +After the database is configured, you can deploy the sample application and connect it to the database service. diff --git a/modules/sbo-deploying-a-postgresql-database-operator-power-z.adoc b/modules/sbo-deploying-a-postgresql-database-operator-power-z.adoc new file mode 100644 index 0000000000..85d786aa26 --- /dev/null +++ b/modules/sbo-deploying-a-postgresql-database-operator-power-z.adoc @@ -0,0 +1,78 @@ +[id="sbo-deploying-a-postgresql-operator-instance-power-z_{context}"] += Deploying a PostgreSQL Operator + +* To deploy the Dev4Devs PostgreSQL Operator in the `my-postgresql` namespace run the following command in shell: + +[source,terminal] +---- +$ oc apply -f - << EOD +--- +apiVersion: v1 +kind: Namespace +metadata: + name: my-postgresql +--- +apiVersion: operators.coreos.com/v1 +kind: OperatorGroup +metadata: + name: postgres-operator-group + namespace: my-postgresql +--- +apiVersion: operators.coreos.com/v1alpha1 +kind: CatalogSource +metadata: + name: ibm-multiarch-catalog + namespace: openshift-marketplace +spec: + sourceType: grpc + image: quay.io/ibm/operator-registry- <1> + imagePullPolicy: IfNotPresent + displayName: ibm-multiarch-catalog + updateStrategy: + registryPoll: + interval: 30m +--- +apiVersion: operators.coreos.com/v1alpha1 +kind: Subscription +metadata: + name: postgresql-operator-dev4devs-com + namespace: openshift-operators +spec: + channel: alpha + installPlanApproval: Automatic + name: postgresql-operator-dev4devs-com + source: ibm-multiarch-catalog + sourceNamespace: openshift-marketplace +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: database-view + labels: + servicebinding.io/controller: "true" +rules: + - apiGroups: + - postgresql.dev4devs.com + resources: + - databases + verbs: + - get + - list +EOD +---- +<1> The Operator image. +* For IBM Power Systems: `quay.io/ibm/operator-registry-ppc64le:release-4.9` +* For IBM Z and LinuxONE: `quay.io/ibm/operator-registry-s390x:release-4.8` + +After the operator is installed, list the operator subscriptions in `openshift-operators` namespace: +[source,terminal] +---- +$ oc get subs -n openshift-operators +---- +.Example output +[source,terminal] +---- +NAME PACKAGE SOURCE CHANNEL +postgresql-operator-dev4devs-com postgresql-operator-dev4devs-com ibm-multiarch-catalog alpha +rh-service-binding-operator rh-service-binding-operator redhat-operators stable +---- \ No newline at end of file diff --git a/modules/sbo-deploying-the-spring-petclinic-sample-application-power-z.adoc b/modules/sbo-deploying-the-spring-petclinic-sample-application-power-z.adoc new file mode 100644 index 0000000000..4a25c03ada --- /dev/null +++ b/modules/sbo-deploying-the-spring-petclinic-sample-application-power-z.adoc @@ -0,0 +1,115 @@ +[id="sbo-deploying-the-spring-petclinic-sample-application-ibm-power-z_{context}"] += Deploying the Spring PetClinic sample application + +To deploy the Spring PetClinic sample application on an {product-title} cluster, you must use a deployment configuration and configure your local environment to be able to test the application. + +[discrete] +.Procedure + +. Deploy the `spring-petclinic-rest` application with the `PostgresCluster` custom resource (CR) by running the following command in shell: ++ +[source,terminal] +---- +$ oc apply -f - << EOD +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: spring-petclinic-rest + namespace: my-postgresql + labels: + app: spring-petclinic-rest +spec: + replicas: 1 + selector: + matchLabels: + app: spring-petclinic-rest + template: + metadata: + labels: + app: spring-petclinic-rest + spec: + containers: + - name: application + image: quay.io/service-binding/spring-petclinic-rest:latest + env: + - name: SPRING_PROFILES_ACTIVE + value: postgresql,spring-data-jpa + - name: org.springframework.cloud.bindings.boot.enable + value: "true" + ports: + - name: http + containerPort: 9966 +--- +apiVersion: v1 +kind: Service +metadata: + name: spring-petclinic-rest + namespace: my-postgresql +spec: + ports: + - port: 80 + targetPort: 9966 + selector: + app: spring-petclinic-rest +--- +EOD +---- ++ +The output verifies that the Spring PetClinic sample application is created and deployed: ++ +.Example output +[source,terminal] +---- +deployment.apps/spring-petclinic-rest created +service/spring-petclinic-rest created +---- ++ +[source,terminal] +---- +$ oc get pods -n my-postgresql +---- ++ +The output verifies that the database is created: ++ +.Example output +[source,terminal] +---- +NAME READY STATUS RESTARTS AGE +sampledatabase-cbc655488-6n25f 0/1 Running 0 1m +spring-petclinic-rest-7659d5b774-zkjpg 2/2 Running 0 2m +---- ++ +. Set up port forwarding from the application port to access the sample application from your local environment: ++ +[source,terminal] +---- +$ oc port-forward --address 0.0.0.0 svc/spring-petclinic-rest 9966:80 -n my-postgresql +---- + +. Access link:http://localhost:9966/petclinic[http://localhost:9966/petclinic]. ++ +You can now remotely access the Spring PetClinic sample application at localhost:9966. ++ +[NOTE] +==== +The application is not yet connected to the database service. If you try to interact with the application, it will return errors. +==== ++ +For example, if you try to access the list of all pets using `curl`, you can see an error message similar to the following sample message: ++ +[source,text] +---- +$ curl -X GET "http://localhost:9966/petclinic/api/pets" -H "accept: application/json" +---- ++ +.Example output +[source,text] +---- +{"className":"org.springframework.transaction.CannotCreateTransactionException","exMessage":"Could +not open JPA EntityManager for transaction; nested exception is +org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC +Connection"} +---- + +You can now use the {servicebinding-title} to connect the application to the database service.