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 index 060536a28be0..1db7841e7c41 100644 --- 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 @@ -7,6 +7,7 @@ include::modules/servicebinding-document-attributes.adoc[] toc::[] +[role="_abstract"] 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 @@ -15,7 +16,6 @@ The {servicebinding-title} manages the data plane for workloads and backing serv * 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 @@ -30,9 +30,8 @@ include::modules/sbo-deploying-the-spring-petclinic-sample-application-power-z.a //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"] - [role="_additional-resources"] +[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] diff --git a/images/img_power.png b/images/img_power.png index ffb97db9e578..419fa79a55a1 100644 Binary files a/images/img_power.png and b/images/img_power.png differ 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 index 1bdd81a3d6e8..e3f058433f06 100644 --- 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 @@ -2,6 +2,7 @@ [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 +[role="_abstract"] 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] @@ -11,25 +12,23 @@ To connect the sample application to the database service, you must create a `Se + [source,terminal] ---- -$ oc apply -f - << EOD +$ oc apply -n my-petclinic -f - << EOD --- apiVersion: binding.operators.coreos.com/v1alpha1 kind: ServiceBinding metadata: - name: spring-petclinic-rest - namespace: my-postgresql + name: spring-petclinic-pgcluster spec: - services: <1> + 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 + application: <3> + name: spring-petclinic + group: apps + version: v1 + resource: deployments EOD ---- <1> Specifies a list of service resources. @@ -41,77 +40,45 @@ The output verifies that the `ServiceBinding` CR is created to project the bindi .Example output [source,terminal] ---- -servicebinding.binding.operators.coreos.com/spring-petclinic-rest created +servicebinding.binding.operators.coreos.com/spring-petclinic created ---- -. To verify that the binding is successful, check the status conditions of the binding resource: +. Verify that the request for service binding is successful: + [source,terminal] ---- -$ oc get servicebindings spring-petclinic-rest -n my-postgresql -o jsonpath-as-json='{.status.conditions}' +$ oc get servicebindings -n my-petclinic ---- + .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", - }, - ], -] +NAME READY REASON AGE +spring-petclinic-postgresql True ApplicationsBound 47m ---- + -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. +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. For example, all the values from the Secret resource are projected into the `bindings/spring-petclinic-pgcluster` directory. . Once this is created, you can go to the topology to see the visual connection. + -.Connecting spring-petclinic-rest to sampledatabase +.Connecting spring-petclinic to a sample database 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" +$ oc port-forward --address 0.0.0.0 svc/spring-petclinic 8080:80 -n my-petclinic ---- + .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... +Forwarding from 0.0.0.0:8080 -> 8080 +Handling connection for 8080 ---- + +. Access link:http://localhost:8080[http://localhost:8080]. + -The previous output shows the initially configured sample data and verifies that the application is now connected to the database service. +You can now remotely access the Spring PetClinic sample application at localhost:8080 and see 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 index 04b689eafec6..cbe94d029931 100644 --- a/modules/sbo-creating-a-postgresql-database-instance-power-z.adoc +++ b/modules/sbo-creating-a-postgresql-database-instance-power-z.adoc @@ -2,11 +2,12 @@ [id="sbo-creating-a-postgresql-database-instance-power-z_{context}"] = Creating a PostgreSQL database instance +[role="_abstract"] 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: +. Create the `Database` CR in the `my-petclinic` namespace by running the following command in shell: + [source,terminal] ---- @@ -15,7 +16,7 @@ apiVersion: postgresql.dev4devs.com/v1alpha1 kind: Database metadata: name: sampledatabase - namespace: my-postgresql + namespace: my-petclinic annotations: host: sampledatabase type: postgresql @@ -38,7 +39,7 @@ spec: databaseStorageRequest: 1Gi databaseUser: "sampleuser" databaseUserKeyEnvVar: POSTGRESQL_USER - image: registry.redhat.io/rhel8/postgresql-96:latest + image: registry.redhat.io/rhel8/postgresql-13:latest databaseStorageClassName: nfs-storage-provisioner size: 1 EOD @@ -54,14 +55,14 @@ The output verifies that the database instance is created: 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): +. After you have created the database instance, ensure that all the pods in the `my-petclinic` namespace are running: + [source,terminal] ---- -$ oc get pods -n my-postgresql +$ oc get pods -n my-petclinic ---- + -The output verifies that the database is created: +The output, which takes a few minutes to display, verifies that the database is created and configured: + .Example output [source,terminal] @@ -69,29 +70,5 @@ The output verifies that the database is created: 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 index 785504509a64..e7ffdf2b4928 100644 --- a/modules/sbo-deploying-a-postgresql-database-operator-power-z.adoc +++ b/modules/sbo-deploying-a-postgresql-database-operator-power-z.adoc @@ -1,7 +1,10 @@ +:_content-type: PROCEDURE [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: +.Procedure + +. To deploy the Dev4Devs PostgreSQL Operator in the `my-petclinic` namespace run the following command in shell: [source,terminal] ---- @@ -10,13 +13,13 @@ $ oc apply -f - << EOD apiVersion: v1 kind: Namespace metadata: - name: my-postgresql + name: my-petclinic --- apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: postgres-operator-group - namespace: my-postgresql + namespace: my-petclinic --- apiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource @@ -64,11 +67,15 @@ EOD * For IBM Power: `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: +.Verification + +. After the operator is installed, list the operator subscriptions in the `openshift-operators` namespace: ++ [source,terminal] ---- $ oc get subs -n openshift-operators ---- ++ .Example output [source,terminal] ---- 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 index a1abc4384be3..497362da5b44 100644 --- a/modules/sbo-deploying-the-spring-petclinic-sample-application-power-z.adoc +++ b/modules/sbo-deploying-the-spring-petclinic-sample-application-power-z.adoc @@ -2,58 +2,61 @@ [id="sbo-deploying-the-spring-petclinic-sample-application-ibm-power-z_{context}"] = Deploying the Spring PetClinic sample application +[role="_abstract"] 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: +. Deploy the `spring-petclinic` application with the `PostgresCluster` custom resource (CR) by running the following command in shell: + [source,terminal] ---- -$ oc apply -f - << EOD +$ oc apply -n my-petclinic -f - << EOD --- apiVersion: apps/v1 kind: Deployment metadata: - name: spring-petclinic-rest - namespace: my-postgresql + name: spring-petclinic labels: - app: spring-petclinic-rest + app: spring-petclinic spec: replicas: 1 selector: matchLabels: - app: spring-petclinic-rest + app: spring-petclinic template: metadata: labels: - app: spring-petclinic-rest + app: spring-petclinic spec: containers: - - name: application - image: quay.io/service-binding/spring-petclinic-rest:latest + - name: app + image: quay.io/service-binding/spring-petclinic:latest + imagePullPolicy: Always env: - name: SPRING_PROFILES_ACTIVE - value: postgresql,spring-data-jpa + value: postgres - name: org.springframework.cloud.bindings.boot.enable value: "true" ports: - name: http - containerPort: 9966 + containerPort: 8080 --- apiVersion: v1 kind: Service metadata: - name: spring-petclinic-rest - namespace: my-postgresql + labels: + app: spring-petclinic + name: spring-petclinic spec: + type: NodePort ports: - - port: 80 - targetPort: 9966 + - port: 80 + protocol: TCP + targetPort: 8080 selector: - app: spring-petclinic-rest ---- + app: spring-petclinic EOD ---- + @@ -62,55 +65,35 @@ The output verifies that the Spring PetClinic sample application is created and .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 +deployment.apps/spring-petclinic created +service/spring-petclinic created ---- + -. 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. +If you are deploying the application using *Container images* in the *Developer* perspective of the web console, you must enter the following environment variables under the *Deployment* section of the *Advanced options*: + +* Name: SPRING_PROFILES_ACTIVE +* Value: postgres ==== + +. Verify that the application is not yet connected to the database service by running the following command: + + -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] +[source,terminal] ---- -$ curl -X GET "http://localhost:9966/petclinic/api/pets" -H "accept: application/json" +$ oc get pods -n my-petclinic ---- + +It takes take a few minutes until the `CrashLoopBackOff` status is displayed: ++ .Example output -[source,text] +[source,terminal] ---- -{"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"} +NAME READY STATUS RESTARTS AGE +spring-petclinic-5b4c7999d4-wzdtz 0/1 CrashLoopBackOff 4 (13s ago) 2m25s ---- ++ +At this stage, the pod fails to start. If you try to interact with the application, it returns errors. You can now use the {servicebinding-title} to connect the application to the database service.