{"id":50022,"date":"2026-06-23T07:49:03","date_gmt":"2026-06-23T07:49:03","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=50022"},"modified":"2026-06-23T07:49:04","modified_gmt":"2026-06-23T07:49:04","slug":"openshift-how-to-deploy-a-java-application-on-kubernetes","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/openshift-how-to-deploy-a-java-application-on-kubernetes\/","title":{"rendered":"OpenShift Lab 13: Deploy a Java Spring Boot Application with MySQL Using the OpenShift Web Console"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Lab Objective<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In this lab, you will deploy a Java Spring Boot application on OpenShift using the OpenShift web console.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You will deploy two components:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A MySQL database.<\/li>\n\n\n\n<li>A Java Spring PetClinic application.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The Java application will connect to the MySQL database using OpenShift internal service discovery.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This lab is a modern replacement for the older \u201cDeploy a Java application on Kubernetes\u201d lab. The original lab used Developer Sandbox and an ephemeral MySQL template. This replacement is updated for OpenShift Local and uses current OpenShift resources such as Deployment, Service, Secret, PersistentVolumeClaim, BuildConfig, ImageStream, and Route.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">What You Will Learn<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You will learn how to:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Start OpenShift Local.<\/li>\n\n\n\n<li>Log in to the OpenShift web console.<\/li>\n\n\n\n<li>Create a new OpenShift project.<\/li>\n\n\n\n<li>Deploy MySQL using the web console.<\/li>\n\n\n\n<li>Store database credentials in a Secret.<\/li>\n\n\n\n<li>Store MySQL data on a PersistentVolumeClaim.<\/li>\n\n\n\n<li>Expose MySQL internally using a Service.<\/li>\n\n\n\n<li>Import a Java Spring Boot application from Git.<\/li>\n\n\n\n<li>Build the Java application using OpenShift Source-to-Image.<\/li>\n\n\n\n<li>Use the Java builder image.<\/li>\n\n\n\n<li>Configure the Java application to connect to MySQL.<\/li>\n\n\n\n<li>Deploy the application using a Kubernetes Deployment.<\/li>\n\n\n\n<li>Expose the Java application externally using a Route.<\/li>\n\n\n\n<li>Validate the application from the browser.<\/li>\n\n\n\n<li>Validate database connectivity from CLI.<\/li>\n\n\n\n<li>Troubleshoot common build, deployment, and database issues.<\/li>\n\n\n\n<li>Clean up the lab environment.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Lab Architecture<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">GitHub Repository\n     |\n     v\nOpenShift Source-to-Image Build\n     |\n     v\nApplication Image\n     |\n     v\nSpring PetClinic Deployment\n     |\n     v\nSpring PetClinic Pod\n     |\n     v\nSpring PetClinic Service\n     |\n     v\nSpring PetClinic Route\n     |\n     v\nBrowser\n\n\nSpring PetClinic Pod\n     |\n     | jdbc:mysql:<span class=\"hljs-comment\">\/\/mysql:3306\/petclinic<\/span>\n     v\nMySQL Service\n     |\n     v\nMySQL Pod\n     |\n     v\nPersistentVolumeClaim\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Resources Created in This Lab<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Resource<\/th><th>Name<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>Project<\/td><td><code>lab13-java-mysql<\/code><\/td><td>Isolated namespace for the lab<\/td><\/tr><tr><td>Secret<\/td><td><code>mysql-secret<\/code><\/td><td>Stores MySQL credentials<\/td><\/tr><tr><td>PersistentVolumeClaim<\/td><td><code>mysql-data<\/code><\/td><td>Stores MySQL data<\/td><\/tr><tr><td>Deployment<\/td><td><code>mysql<\/code><\/td><td>Runs the MySQL database<\/td><\/tr><tr><td>Service<\/td><td><code>mysql<\/code><\/td><td>Provides internal DNS name for MySQL<\/td><\/tr><tr><td>BuildConfig<\/td><td><code>spring-petclinic<\/code><\/td><td>Defines how OpenShift builds the Java app<\/td><\/tr><tr><td>Build<\/td><td><code>spring-petclinic-1<\/code><\/td><td>One execution of the app build<\/td><\/tr><tr><td>ImageStream<\/td><td><code>spring-petclinic<\/code><\/td><td>Tracks the built app image<\/td><\/tr><tr><td>Deployment<\/td><td><code>spring-petclinic<\/code><\/td><td>Runs the Java app<\/td><\/tr><tr><td>Service<\/td><td><code>spring-petclinic<\/code><\/td><td>Provides internal access to the Java app<\/td><\/tr><tr><td>Route<\/td><td><code>spring-petclinic<\/code><\/td><td>Provides browser access to the Java app<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Important Concept: Kubernetes vs OpenShift<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original article title says Kubernetes, but this lab uses OpenShift features.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Plain Kubernetes does not provide these OpenShift-specific features by default:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Source-to-Image\nBuildConfig\nImageStream\nRoute\nDeveloper perspective\nOpenShift web <span class=\"hljs-built_in\">console<\/span> <span class=\"hljs-keyword\">import<\/span> flow\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">So the technically correct title for this lab is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Deploy a Java Spring Boot Application <span class=\"hljs-keyword\">with<\/span> MySQL on OpenShift\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenShift runs Kubernetes underneath, but this lab specifically teaches the OpenShift developer workflow.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Important Concept: Why MySQL Is Not Exposed with a Route<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A MySQL database should normally not be exposed publicly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Java application connects to MySQL internally using:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">mysql<\/span><span class=\"hljs-selector-pseudo\">:3306<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This works because <code>mysql<\/code> is the name of the OpenShift Service.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Java application will use this JDBC URL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">jdbc:mysql:<span class=\"hljs-comment\">\/\/mysql:3306\/petclinic<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The Java app gets an external Route because it is a web application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The MySQL database does not get a Route because it is an internal database service.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Important Concept: Why We Use Deployment Instead of DeploymentConfig<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Older OpenShift labs often used DeploymentConfig.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This lab uses:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Deployment\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Deployment is the standard Kubernetes workload resource and is the preferred resource type for modern beginner labs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When the web console asks for the resource type, select:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Deployment\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do not select:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">DeploymentConfig\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 1: Prerequisites<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Required Tools<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You need:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>OpenShift Local installed.<\/li>\n\n\n\n<li>The <code>crc<\/code> command available.<\/li>\n\n\n\n<li>The <code>oc<\/code> command available.<\/li>\n\n\n\n<li>Browser access to the OpenShift web console.<\/li>\n\n\n\n<li>Internet access from OpenShift Local to GitHub and container registries.<\/li>\n\n\n\n<li>A valid Red Hat pull secret configured for OpenShift Local.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended Local Machine Resources<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For this lab, use at least:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Resource<\/th><th>Recommended<\/th><\/tr><\/thead><tbody><tr><td>CPU<\/td><td>4 cores or more<\/td><\/tr><tr><td>Memory<\/td><td>12 GB or more<\/td><\/tr><tr><td>Disk<\/td><td>35 GB or more<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Java builds can be slow on small laptops. More memory will make this lab smoother.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 2: Start OpenShift Local<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Open a terminal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check the CRC version:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">crc version\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Set the OpenShift preset:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">crc config <span class=\"hljs-keyword\">set<\/span> preset openshift\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Run setup:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">crc setup\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Start OpenShift Local:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">crc start\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The cluster may take several minutes to start.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After the cluster starts, view the login credentials:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">crc <span class=\"hljs-built_in\">console<\/span> --credentials\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Open the web console:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">crc <span class=\"hljs-built_in\">console<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 3: Configure the <code>oc<\/code> CLI<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">crc oc-env\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">On Linux or macOS, run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">eval<\/span> $(crc oc-env)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">On Windows PowerShell, use the PowerShell command printed by <code>crc oc-env<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Log in as the <code>developer<\/code> user:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc login -u developer https:<span class=\"hljs-comment\">\/\/api.crc.testing:6443<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use the password from:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">crc <span class=\"hljs-built_in\">console<\/span> --credentials\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify the login:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc whoami\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">developer\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check the node:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> nodes\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output should show one OpenShift Local node in <code>Ready<\/code> status.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 4: Create a New Project<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You can create the project from the web console or from CLI.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Option A: Create Project from Web Console<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open the OpenShift web console.<\/li>\n\n\n\n<li>Log in as <code>developer<\/code>.<\/li>\n\n\n\n<li>Switch to the <strong>Developer<\/strong> perspective.<\/li>\n\n\n\n<li>Click the <strong>Project<\/strong> dropdown.<\/li>\n\n\n\n<li>Click <strong>Create Project<\/strong>.<\/li>\n\n\n\n<li>Enter the project name:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">lab13-java-mysql\n<\/code><\/span><\/pre>\n\n\n<ol start=\"7\" class=\"wp-block-list\">\n<li>Optional display name:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Lab 13 Java MySQL\n<\/code><\/span><\/pre>\n\n\n<ol start=\"8\" class=\"wp-block-list\">\n<li>Click <strong>Create<\/strong>.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Option B: Create Project from CLI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-project lab13-java-mysql\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Using project <span class=\"hljs-string\">\"lab13-java-mysql\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 5: Deploy MySQL from the Web Console<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In this section, you will create MySQL using <strong>Import YAML<\/strong> in the OpenShift web console.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This creates:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Secret<\/li>\n\n\n\n<li>PersistentVolumeClaim<\/li>\n\n\n\n<li>MySQL Deployment<\/li>\n\n\n\n<li>MySQL Service<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Using YAML here is more reliable for a classroom lab than depending on an old ephemeral database template.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Open Import YAML<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In the OpenShift web console:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Make sure you are in project:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">lab13-java-mysql\n<\/code><\/span><\/pre>\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Switch to <strong>Developer<\/strong> perspective.<\/li>\n\n\n\n<li>Click <strong>+Add<\/strong>.<\/li>\n\n\n\n<li>Click <strong>Import YAML<\/strong>.<\/li>\n\n\n\n<li>Paste the YAML below.<\/li>\n\n\n\n<li>Click <strong>Create<\/strong>.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">YAML: MySQL Database<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">apiVersion: v1\n<span class=\"hljs-attr\">kind<\/span>: Secret\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: mysql-secret\n  <span class=\"hljs-attr\">labels<\/span>:\n    app.kubernetes.io\/name: mysql\n    app.kubernetes.io\/part-<span class=\"hljs-keyword\">of<\/span>: spring-petclinic-demo\n<span class=\"hljs-attr\">type<\/span>: Opaque\n<span class=\"hljs-attr\">stringData<\/span>:\n  MYSQL_USER: petclinic\n  <span class=\"hljs-attr\">MYSQL_PASSWORD<\/span>: petclinic\n  <span class=\"hljs-attr\">MYSQL_PASS<\/span>: petclinic\n  <span class=\"hljs-attr\">MYSQL_ROOT_PASSWORD<\/span>: petclinic-root\n  <span class=\"hljs-attr\">MYSQL_DATABASE<\/span>: petclinic\n---\napiVersion: v1\n<span class=\"hljs-attr\">kind<\/span>: PersistentVolumeClaim\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: mysql-data\n  <span class=\"hljs-attr\">labels<\/span>:\n    app.kubernetes.io\/name: mysql\n    app.kubernetes.io\/part-<span class=\"hljs-keyword\">of<\/span>: spring-petclinic-demo\n<span class=\"hljs-attr\">spec<\/span>:\n  accessModes:\n    - ReadWriteOnce\n  <span class=\"hljs-attr\">resources<\/span>:\n    requests:\n      storage: <span class=\"hljs-number\">1<\/span>Gi\n---\napiVersion: apps\/v1\n<span class=\"hljs-attr\">kind<\/span>: Deployment\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: mysql\n  <span class=\"hljs-attr\">labels<\/span>:\n    app: mysql\n    app.kubernetes.io\/name: mysql\n    app.kubernetes.io\/part-<span class=\"hljs-keyword\">of<\/span>: spring-petclinic-demo\n<span class=\"hljs-attr\">spec<\/span>:\n  replicas: <span class=\"hljs-number\">1<\/span>\n  <span class=\"hljs-attr\">selector<\/span>:\n    matchLabels:\n      app: mysql\n  <span class=\"hljs-attr\">strategy<\/span>:\n    type: Recreate\n  <span class=\"hljs-attr\">template<\/span>:\n    metadata:\n      labels:\n        app: mysql\n        app.kubernetes.io\/name: mysql\n        app.kubernetes.io\/part-<span class=\"hljs-keyword\">of<\/span>: spring-petclinic-demo\n    <span class=\"hljs-attr\">spec<\/span>:\n      terminationGracePeriodSeconds: <span class=\"hljs-number\">30<\/span>\n      <span class=\"hljs-attr\">containers<\/span>:\n        - name: mysql\n          <span class=\"hljs-attr\">image<\/span>: registry.redhat.io\/rhel9\/mysql<span class=\"hljs-number\">-80<\/span>:latest\n          <span class=\"hljs-attr\">imagePullPolicy<\/span>: IfNotPresent\n          <span class=\"hljs-attr\">ports<\/span>:\n            - name: mysql\n              <span class=\"hljs-attr\">containerPort<\/span>: <span class=\"hljs-number\">3306<\/span>\n              <span class=\"hljs-attr\">protocol<\/span>: TCP\n          <span class=\"hljs-attr\">env<\/span>:\n            - name: MYSQL_USER\n              <span class=\"hljs-attr\">valueFrom<\/span>:\n                secretKeyRef:\n                  name: mysql-secret\n                  <span class=\"hljs-attr\">key<\/span>: MYSQL_USER\n            - name: MYSQL_PASSWORD\n              <span class=\"hljs-attr\">valueFrom<\/span>:\n                secretKeyRef:\n                  name: mysql-secret\n                  <span class=\"hljs-attr\">key<\/span>: MYSQL_PASSWORD\n            - name: MYSQL_ROOT_PASSWORD\n              <span class=\"hljs-attr\">valueFrom<\/span>:\n                secretKeyRef:\n                  name: mysql-secret\n                  <span class=\"hljs-attr\">key<\/span>: MYSQL_ROOT_PASSWORD\n            - name: MYSQL_DATABASE\n              <span class=\"hljs-attr\">valueFrom<\/span>:\n                secretKeyRef:\n                  name: mysql-secret\n                  <span class=\"hljs-attr\">key<\/span>: MYSQL_DATABASE\n          <span class=\"hljs-attr\">resources<\/span>:\n            requests:\n              cpu: <span class=\"hljs-number\">100<\/span>m\n              <span class=\"hljs-attr\">memory<\/span>: <span class=\"hljs-number\">512<\/span>Mi\n            <span class=\"hljs-attr\">limits<\/span>:\n              cpu: <span class=\"hljs-number\">500<\/span>m\n              <span class=\"hljs-attr\">memory<\/span>: <span class=\"hljs-number\">1<\/span>Gi\n          <span class=\"hljs-attr\">readinessProbe<\/span>:\n            tcpSocket:\n              port: <span class=\"hljs-number\">3306<\/span>\n            <span class=\"hljs-attr\">initialDelaySeconds<\/span>: <span class=\"hljs-number\">20<\/span>\n            <span class=\"hljs-attr\">periodSeconds<\/span>: <span class=\"hljs-number\">10<\/span>\n            <span class=\"hljs-attr\">timeoutSeconds<\/span>: <span class=\"hljs-number\">3<\/span>\n          <span class=\"hljs-attr\">livenessProbe<\/span>:\n            tcpSocket:\n              port: <span class=\"hljs-number\">3306<\/span>\n            <span class=\"hljs-attr\">initialDelaySeconds<\/span>: <span class=\"hljs-number\">60<\/span>\n            <span class=\"hljs-attr\">periodSeconds<\/span>: <span class=\"hljs-number\">20<\/span>\n            <span class=\"hljs-attr\">timeoutSeconds<\/span>: <span class=\"hljs-number\">3<\/span>\n          <span class=\"hljs-attr\">securityContext<\/span>:\n            allowPrivilegeEscalation: <span class=\"hljs-literal\">false<\/span>\n            <span class=\"hljs-attr\">capabilities<\/span>:\n              drop:\n                - ALL\n          <span class=\"hljs-attr\">volumeMounts<\/span>:\n            - name: mysql-data\n              <span class=\"hljs-attr\">mountPath<\/span>: <span class=\"hljs-regexp\">\/var\/<\/span>lib\/mysql\/data\n      <span class=\"hljs-attr\">volumes<\/span>:\n        - name: mysql-data\n          <span class=\"hljs-attr\">persistentVolumeClaim<\/span>:\n            claimName: mysql-data\n---\napiVersion: v1\n<span class=\"hljs-attr\">kind<\/span>: Service\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: mysql\n  <span class=\"hljs-attr\">labels<\/span>:\n    app: mysql\n    app.kubernetes.io\/name: mysql\n    app.kubernetes.io\/part-<span class=\"hljs-keyword\">of<\/span>: spring-petclinic-demo\n<span class=\"hljs-attr\">spec<\/span>:\n  type: ClusterIP\n  <span class=\"hljs-attr\">selector<\/span>:\n    app: mysql\n  <span class=\"hljs-attr\">ports<\/span>:\n    - name: mysql\n      <span class=\"hljs-attr\">protocol<\/span>: TCP\n      <span class=\"hljs-attr\">port<\/span>: <span class=\"hljs-number\">3306<\/span>\n      <span class=\"hljs-attr\">targetPort<\/span>: <span class=\"hljs-number\">3306<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 6: Understand the MySQL YAML<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Secret<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">kind: Secret\nmetadata:\n  name: mysql-secret\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The Secret stores the database credentials.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Important values:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">MYSQL_USER=petclinic\nMYSQL_PASSWORD=petclinic\nMYSQL_DATABASE=petclinic\nMYSQL_ROOT_PASSWORD=petclinic-root\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For this lab, the values are simple so students can understand the workflow.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In real production environments, do not commit plain database passwords to Git.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">PersistentVolumeClaim<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">kind: PersistentVolumeClaim\nmetadata:\n  name: mysql-data\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The PVC stores the MySQL data files.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The MySQL data directory is mounted here:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">\/<span class=\"hljs-keyword\">var<\/span>\/lib\/mysql\/data\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This means the database data can survive a MySQL pod restart.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Deployment<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">kind: Deployment\nmetadata:\n  name: mysql\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The Deployment runs one MySQL pod.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The strategy is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">strategy:\n  type: Recreate\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is suitable for a single-instance database in a beginner lab because OpenShift stops the old pod before starting a new one.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Service<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">kind: Service\nmetadata:\n  name: mysql\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The Service gives the database a stable internal DNS name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Other pods in the same project can connect to MySQL using:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">mysql<\/span><span class=\"hljs-selector-pseudo\">:3306<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is why the Java application will use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">jdbc:mysql:<span class=\"hljs-comment\">\/\/mysql:3306\/petclinic<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 7: Verify MySQL from the Web Console<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In the web console:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to <strong>Developer<\/strong> perspective.<\/li>\n\n\n\n<li>Open <strong>Topology<\/strong>.<\/li>\n\n\n\n<li>Confirm that you see a workload named:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mysql\n<\/code><\/span><\/pre>\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Click the <code>mysql<\/code> workload.<\/li>\n\n\n\n<li>Open the <strong>Resources<\/strong> tab.<\/li>\n\n\n\n<li>Confirm that the pod is running.<\/li>\n\n\n\n<li>Open the <strong>Logs<\/strong> tab.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The MySQL pod should start successfully.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 8: Verify MySQL from CLI<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Set the project:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab13-java-mysql\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check resources:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deploy,pod,svc,pvc,secret\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected resources:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">deployment.apps\/mysql\npod\/mysql-xxxxx\nservice\/mysql\npersistentvolumeclaim\/mysql-data\nsecret\/mysql-secret\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check rollout:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout status deployment\/mysql\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">deployment <span class=\"hljs-string\">\"mysql\"<\/span> successfully rolled out\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check the PVC:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pvc mysql-data\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected status:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Bound\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check MySQL logs:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs deployment\/mysql\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 9: Test MySQL Login<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Find the MySQL pod:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">MYSQL_POD=$(oc get pod -l app=mysql -o jsonpath=<span class=\"hljs-string\">'{.items&#91;0].metadata.name}'<\/span>)\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$MYSQL_POD\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Open a shell inside the MySQL pod:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc rsh <span class=\"hljs-string\">\"$MYSQL_POD\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Inside the pod, connect to MySQL:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mysql -u petclinic -ppetclinic petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">SHOW DATABASES;\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You should see:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Exit MySQL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">exit<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Exit the pod shell:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">exit<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 10: Deploy the Java Spring PetClinic Application from Git<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Now you will deploy the Java application from source code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The application source repository is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">https:<span class=\"hljs-comment\">\/\/github.com\/redhat-developer-demos\/spring-petclinic<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This repository contains a Spring Boot PetClinic application prepared for OpenShift Source-to-Image.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Open Import from Git<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In the OpenShift web console:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Make sure you are in project:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">lab13-java-mysql\n<\/code><\/span><\/pre>\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Switch to <strong>Developer<\/strong> perspective.<\/li>\n\n\n\n<li>Click <strong>+Add<\/strong>.<\/li>\n\n\n\n<li>Click <strong>Import from Git<\/strong> or <strong>From Git<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The exact label depends on your OpenShift console version.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Enter Git Repository URL<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In the Git repository URL field, enter:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">https:<span class=\"hljs-comment\">\/\/github.com\/redhat-developer-demos\/spring-petclinic<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenShift will inspect the repository.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You may see an import warning because the repository contains older metadata such as a devfile or Dockerfile. This is expected for this lab.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The correct action is to manually choose the Builder Image strategy.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 11: Select the Correct Import Strategy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Click:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Edit Import Strategy\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Select:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Builder Image\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For the builder image, select:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Java\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For the Java version, select:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OpenJDK 11\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If OpenJDK 11 is not shown in your environment, use the available Java builder image recommended by your instructor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For this specific Spring PetClinic sample, Java 11 is the safest choice because the sample repository is older and its Dockerfile also references OpenJDK 11.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 12: Configure Application Details<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Scroll to the application details section.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use the following values:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Field<\/th><th>Value<\/th><\/tr><\/thead><tbody><tr><td>Application name<\/td><td><code>spring-petclinic-demo<\/code><\/td><\/tr><tr><td>Name<\/td><td><code>spring-petclinic<\/code><\/td><\/tr><tr><td>Resource type<\/td><td><code>Deployment<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Set:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application name: spring-petclinic-demo\nName: spring-petclinic\nResource type: Deployment\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Make sure the selected resource type is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Deployment\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do not select:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">DeploymentConfig\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 13: Create a Route for the Java Application<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Open <strong>Advanced options<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Enable:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Create a route to the application\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is needed because Spring PetClinic is a web application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Route will allow you to open the application in your browser.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 14: Add Environment Variables<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In <strong>Advanced options<\/strong>, open the <strong>Environment variables<\/strong> section.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Add the following environment variables:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Name<\/th><th>Value<\/th><\/tr><\/thead><tbody><tr><td><code>SPRING_PROFILES_ACTIVE<\/code><\/td><td><code>mysql<\/code><\/td><\/tr><tr><td><code>MYSQL_URL<\/code><\/td><td><code>jdbc:mysql:\/\/mysql:3306\/petclinic<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The final values should be:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">SPRING_PROFILES_ACTIVE=mysql\nMYSQL_URL=jdbc:mysql:<span class=\"hljs-comment\">\/\/mysql:3306\/petclinic<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">These values tell Spring PetClinic to:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Use the MySQL Spring profile.<\/li>\n\n\n\n<li>Connect to MySQL using the OpenShift Service named <code>mysql<\/code>.<\/li>\n\n\n\n<li>Use the <code>petclinic<\/code> database.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The sample application defaults to this database username and password:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">Username<\/span>: petclinic\n<span class=\"hljs-attribute\">Password<\/span>: petclinic\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">These values match the MySQL Secret created earlier.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Optional: Add Explicit MySQL User and Password<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If your instructor wants students to make credentials explicit, add these two environment variables also:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Name<\/th><th>Value<\/th><\/tr><\/thead><tbody><tr><td><code>MYSQL_USER<\/code><\/td><td><code>petclinic<\/code><\/td><\/tr><tr><td><code>MYSQL_PASS<\/code><\/td><td><code>petclinic<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">So the complete environment variable list becomes:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">SPRING_PROFILES_ACTIVE=mysql\nMYSQL_URL=jdbc:mysql:<span class=\"hljs-comment\">\/\/mysql:3306\/petclinic<\/span>\nMYSQL_USER=petclinic\nMYSQL_PASS=petclinic\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For the beginner lab, either approach works because the application defaults already match the lab database values.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 15: Create the Java Application<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Review the form.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You should have:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Setting<\/th><th>Expected Value<\/th><\/tr><\/thead><tbody><tr><td>Project<\/td><td><code>lab13-java-mysql<\/code><\/td><\/tr><tr><td>Git Repository<\/td><td><code>https:\/\/github.com\/redhat-developer-demos\/spring-petclinic<\/code><\/td><\/tr><tr><td>Import Strategy<\/td><td>Builder Image<\/td><\/tr><tr><td>Builder Image<\/td><td>Java<\/td><\/tr><tr><td>Java Version<\/td><td>OpenJDK 11 if available<\/td><\/tr><tr><td>Application name<\/td><td><code>spring-petclinic-demo<\/code><\/td><\/tr><tr><td>Name<\/td><td><code>spring-petclinic<\/code><\/td><\/tr><tr><td>Resource type<\/td><td>Deployment<\/td><\/tr><tr><td>Create route<\/td><td>Enabled<\/td><\/tr><tr><td><code>SPRING_PROFILES_ACTIVE<\/code><\/td><td><code>mysql<\/code><\/td><\/tr><tr><td><code>MYSQL_URL<\/code><\/td><td><code>jdbc:mysql:\/\/mysql:3306\/petclinic<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Click:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Create\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenShift will now start a Source-to-Image build.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 16: Watch the Java Build<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">After clicking <strong>Create<\/strong>, OpenShift redirects you to the <strong>Topology<\/strong> view.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You should see:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The build may take several minutes because Maven dependencies must be downloaded.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To view build progress from the web console:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Click the <code>spring-petclinic<\/code> workload.<\/li>\n\n\n\n<li>Open the <strong>Resources<\/strong> tab.<\/li>\n\n\n\n<li>Find the build.<\/li>\n\n\n\n<li>Open the build details.<\/li>\n\n\n\n<li>Click <strong>Logs<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Typical build stages:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Cloning Git repository\nRunning Maven build\nCreating application artifact\nAssembling S2I image\nPushing image to OpenShift internal registry\nStarting deployment rollout\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 17: Watch the Build from CLI<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">From your terminal, run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab13-java-mysql\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">List BuildConfigs:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> bc\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">List builds:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> builds\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">spring-petclinic-1\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Follow build logs:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs -f bc\/spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Wait until the build completes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Expected build status:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> builds\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected result:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">spring-petclinic-1   Complete\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 18: Verify the Application Deployment<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Check the Deployment:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deployment spring-petclinic\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">NAME               READY   UP-TO-DATE   AVAILABLE\nspring-petclinic   1\/1     1            1\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check rollout status:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout status deployment\/spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">deployment <span class=\"hljs-string\">\"spring-petclinic\"<\/span> successfully rolled out\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output should include:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mysql-xxxxx                  1\/1     Running\nspring-petclinic-xxxxx       1\/1     Running\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Java app logs:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs deployment\/spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You should see Spring Boot startup logs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 19: Verify Service and Route<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Check services:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> svc\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected services:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mysql\nspring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check routes:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected route:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Store the app URL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">APP_URL=<span class=\"hljs-string\">\"http:\/\/$(oc get route spring-petclinic -o jsonpath='{.spec.host}')\"<\/span>\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$APP_URL\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Test the route:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl -I <span class=\"hljs-string\">\"$APP_URL\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected result should include an HTTP response.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\">HTTP\/1.1 <span class=\"hljs-number\">200<\/span> OK\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Open the URL in your browser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You should see the Spring PetClinic application.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 20: Test the Application in Browser<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In the Spring PetClinic UI:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open the application route.<\/li>\n\n\n\n<li>Click <strong>Find owners<\/strong>.<\/li>\n\n\n\n<li>Click <strong>Find Owner<\/strong> without entering anything.<\/li>\n\n\n\n<li>You should see the list of sample owners.<\/li>\n\n\n\n<li>Click <strong>Add Owner<\/strong>.<\/li>\n\n\n\n<li>Add a new owner.<\/li>\n\n\n\n<li>Save.<\/li>\n\n\n\n<li>Search again and confirm the new owner appears.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">This confirms:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>The Java application is running.<\/li>\n\n\n\n<li>The app can connect to MySQL.<\/li>\n\n\n\n<li>The app can write data to MySQL.<\/li>\n\n\n\n<li>The app can read data from MySQL.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 21: Verify Data in MySQL<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Find the MySQL pod:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">MYSQL_POD=$(oc get pod -l app=mysql -o jsonpath=<span class=\"hljs-string\">'{.items&#91;0].metadata.name}'<\/span>)\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$MYSQL_POD\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Run MySQL command directly:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc exec -it <span class=\"hljs-string\">\"$MYSQL_POD\"<\/span> -- mysql -u petclinic -ppetclinic petclinic\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Inside MySQL, run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">SHOW TABLES;\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output should include tables such as:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">owners\npets\ntypes\nvets\nvisits\nspecialties\nvet_specialties\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check owners:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">SELECT id, first_name, last_name, city FROM owners LIMIT 10;\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Exit MySQL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">exit<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 22: Prove MySQL Persistence<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In this section, you will restart the MySQL pod and confirm that data is still present.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Scale MySQL down:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc scale deployment\/mysql --replicas=0\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Scale MySQL back up:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc scale deployment\/mysql --replicas=1\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Wait for rollout:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout status deployment\/mysql\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Restart the Java app so it reconnects cleanly:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout restart deployment\/spring-petclinic\noc rollout status deployment\/spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Open the application again in your browser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check whether the owner data is still present.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the data is still available, the PVC is working.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 23: Understand the Complete Flow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">When you completed this lab, OpenShift performed the following:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-number\">1.<\/span> Created a MySQL Secret.\n<span class=\"hljs-number\">2.<\/span> Created a MySQL PVC.\n<span class=\"hljs-number\">3.<\/span> Started a MySQL Deployment.\n<span class=\"hljs-number\">4.<\/span> Created a MySQL Service named mysql.\n<span class=\"hljs-number\">5.<\/span> Imported Java source code <span class=\"hljs-keyword\">from<\/span> GitHub.\n<span class=\"hljs-number\">6.<\/span> Used a Java builder image.\n<span class=\"hljs-number\">7.<\/span> Created a BuildConfig.\n<span class=\"hljs-number\">8.<\/span> Started a Build.\n<span class=\"hljs-number\">9.<\/span> Built a runnable image using S2I.\n<span class=\"hljs-number\">10.<\/span> Stored the image <span class=\"hljs-keyword\">in<\/span> an ImageStream.\n<span class=\"hljs-number\">11.<\/span> Started a Spring PetClinic Deployment.\n<span class=\"hljs-number\">12.<\/span> Created a Spring PetClinic Service.\n<span class=\"hljs-number\">13.<\/span> Created a Spring PetClinic Route.\n<span class=\"hljs-number\">14.<\/span> Exposed the app <span class=\"hljs-keyword\">in<\/span> the browser.\n<span class=\"hljs-number\">15.<\/span> Connected the Java app to MySQL using internal service discovery.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 24: Student Validation Checklist<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Students should verify:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Check<\/th><th>Command<\/th><th>Expected Result<\/th><\/tr><\/thead><tbody><tr><td>Current project<\/td><td><code>oc project<\/code><\/td><td><code>lab13-java-mysql<\/code><\/td><\/tr><tr><td>MySQL deployment<\/td><td><code>oc get deploy mysql<\/code><\/td><td><code>1\/1<\/code> ready<\/td><\/tr><tr><td>MySQL service<\/td><td><code>oc get svc mysql<\/code><\/td><td>Service exists<\/td><\/tr><tr><td>MySQL PVC<\/td><td><code>oc get pvc mysql-data<\/code><\/td><td><code>Bound<\/code><\/td><\/tr><tr><td>Java BuildConfig<\/td><td><code>oc get bc spring-petclinic<\/code><\/td><td>Exists<\/td><\/tr><tr><td>Java build<\/td><td><code>oc get builds<\/code><\/td><td>Build <code>Complete<\/code><\/td><\/tr><tr><td>ImageStream<\/td><td><code>oc get is spring-petclinic<\/code><\/td><td>Exists<\/td><\/tr><tr><td>Java deployment<\/td><td><code>oc get deploy spring-petclinic<\/code><\/td><td><code>1\/1<\/code> ready<\/td><\/tr><tr><td>Java service<\/td><td><code>oc get svc spring-petclinic<\/code><\/td><td>Service exists<\/td><\/tr><tr><td>Java route<\/td><td><code>oc get route spring-petclinic<\/code><\/td><td>Route exists<\/td><\/tr><tr><td>Browser test<\/td><td>Open route<\/td><td>PetClinic UI opens<\/td><\/tr><tr><td>Database test<\/td><td>Query owners table<\/td><td>Data visible<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 25: Full CLI Validation Script<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run this script after completing the lab:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc project lab13-java-mysql\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking core resources...\"<\/span>\noc get deploy,pod,svc,route,pvc,secret\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking MySQL rollout...\"<\/span>\noc rollout status deployment\/mysql\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking Spring PetClinic build resources...\"<\/span>\noc get bc\noc get builds\noc get imagestream\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking Spring PetClinic rollout...\"<\/span>\noc rollout status deployment\/spring-petclinic\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking application route...\"<\/span>\nAPP_URL=<span class=\"hljs-string\">\"http:\/\/$(oc get route spring-petclinic -o jsonpath='{.spec.host}')\"<\/span>\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$APP_URL\"<\/span>\ncurl -I <span class=\"hljs-string\">\"$APP_URL\"<\/span>\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking MySQL pod...\"<\/span>\nMYSQL_POD=$(oc get pod -l app=mysql -o jsonpath=<span class=\"hljs-string\">'{.items&#91;0].metadata.name}'<\/span>)\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$MYSQL_POD\"<\/span>\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking MySQL tables...\"<\/span>\noc exec <span class=\"hljs-string\">\"$MYSQL_POD\"<\/span> -- mysql -u petclinic -ppetclinic petclinic -e <span class=\"hljs-string\">\"SHOW TABLES;\"<\/span>\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking owners table...\"<\/span>\noc exec <span class=\"hljs-string\">\"$MYSQL_POD\"<\/span> -- mysql -u petclinic -ppetclinic petclinic -e <span class=\"hljs-string\">\"SELECT id, first_name, last_name FROM owners LIMIT 5;\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected result:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>MySQL Deployment is ready.<\/li>\n\n\n\n<li>MySQL PVC is Bound.<\/li>\n\n\n\n<li>Java build is Complete.<\/li>\n\n\n\n<li>Java Deployment is ready.<\/li>\n\n\n\n<li>Route exists.<\/li>\n\n\n\n<li>Browser or <code>curl<\/code> can reach the app.<\/li>\n\n\n\n<li>MySQL contains PetClinic tables.<\/li>\n\n\n\n<li>Owners table returns rows.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 26: Optional CLI-Only Equivalent<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The main lab uses the web console.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For instructor testing, the same Java application can be created from CLI if the Java builder image stream exists in the cluster.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, create the project:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-project lab13-java-mysql-cli\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply the MySQL YAML from this lab.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then create the Java application from Git:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-app java:<span class=\"hljs-number\">11<\/span>~https:<span class=\"hljs-comment\">\/\/github.com\/redhat-developer-demos\/spring-petclinic --name=spring-petclinic \\<\/span>\n  -e SPRING_PROFILES_ACTIVE=mysql \\\n  -e MYSQL_URL=jdbc:mysql:<span class=\"hljs-comment\">\/\/mysql:3306\/petclinic<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expose it:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose svc\/spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Watch build logs:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs -f bc\/spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check rollout:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout status deployment\/spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This CLI section is optional and should be used mainly by instructors.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 27: Troubleshooting<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 1: MySQL Pod Shows ImagePullBackOff<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Symptom<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ImagePullBackOff\nErrImagePull\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Check<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\noc describe pod -l app=mysql\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Possible Causes<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Red Hat pull secret is missing or invalid.<\/li>\n\n\n\n<li>The machine is connected to VPN and cannot reach the registry.<\/li>\n\n\n\n<li>Internet access is blocked.<\/li>\n\n\n\n<li>Registry access is temporarily unavailable.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Fix<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Check CRC status:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">crc status\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check pod events:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> events --sort-by=.lastTimestamp\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-51\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If registry access is the issue, ask the instructor to verify the OpenShift Local pull secret and registry access.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 2: MySQL PVC Is Pending<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Symptom<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pvc mysql-data\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Shows:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Pending\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Check<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc describe pvc mysql-data\noc <span class=\"hljs-keyword\">get<\/span> storageclass\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-53\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Possible Causes<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>No default StorageClass.<\/li>\n\n\n\n<li>OpenShift Local storage is not ready.<\/li>\n\n\n\n<li>Cluster is still starting.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Fix<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wait a short time and check again:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pvc mysql-data\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If it remains Pending, ask the instructor to verify OpenShift Local storage.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 3: Import from Git Shows \u201cImport Is Not Possible\u201d<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Symptom<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The web console shows an import error or warning after entering:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-55\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">https:<span class=\"hljs-comment\">\/\/github.com\/redhat-developer-demos\/spring-petclinic<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-55\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Explanation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This can happen because the repository contains multiple possible build hints, such as a Dockerfile or devfile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is expected for this lab.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fix<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Click:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Edit Import Strategy\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then select:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Builder Image\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Choose:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Java\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then continue.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 4: Java Build Fails<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Check Build Logs<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs -f bc\/spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check build status:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-56\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> builds\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-56\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe the failed build:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe build spring-petclinic-1\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Possible Causes<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Maven dependency download failed.<\/li>\n\n\n\n<li>Network\/VPN issue.<\/li>\n\n\n\n<li>Wrong Java builder image.<\/li>\n\n\n\n<li>OpenShift Local does not have enough memory.<\/li>\n\n\n\n<li>GitHub access is blocked.<\/li>\n\n\n\n<li>The repository import strategy was not changed to Builder Image.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Fix<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use the Java Builder Image strategy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prefer OpenJDK 11 for this sample if available.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Try the build again:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc start-build spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Follow logs:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs -f bc\/spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 5: Java Pod Is CrashLoopBackOff<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Check<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-57\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\noc logs deployment\/spring-petclinic\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-57\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Common Cause<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The application cannot connect to MySQL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check whether MySQL is running:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-58\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deploy mysql\noc <span class=\"hljs-keyword\">get<\/span> svc mysql\noc <span class=\"hljs-keyword\">get<\/span> pods -l app=mysql\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-58\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check whether the Java app has the correct environment variables:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-59\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> env deployment\/spring-petclinic --list\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-59\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Required values:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-60\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">SPRING_PROFILES_ACTIVE=mysql\nMYSQL_URL=jdbc:mysql:<span class=\"hljs-comment\">\/\/mysql:3306\/petclinic<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-60\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If missing, add them:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-61\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> env deployment\/spring-petclinic SPRING_PROFILES_ACTIVE=mysql MYSQL_URL=jdbc:mysql:\/\/mysql:3306\/petclinic\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-61\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Restart the app:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout restart deployment\/spring-petclinic\noc rollout status deployment\/spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 6: Application Opens but Data Is Missing<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Possible Causes<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>App started before MySQL was ready.<\/li>\n\n\n\n<li>App is using H2 instead of MySQL.<\/li>\n\n\n\n<li><code>SPRING_PROFILES_ACTIVE=mysql<\/code> is missing.<\/li>\n\n\n\n<li><code>MYSQL_URL<\/code> is incorrect.<\/li>\n\n\n\n<li>Database schema was not initialized.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Check Environment<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-62\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> env deployment\/spring-petclinic --list\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-62\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check logs:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs deployment\/spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Restart the application:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout restart deployment\/spring-petclinic\noc rollout status deployment\/spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then check MySQL tables again:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-63\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">MYSQL_POD=$(oc get pod -l app=mysql -o jsonpath=<span class=\"hljs-string\">'{.items&#91;0].metadata.name}'<\/span>)\noc exec <span class=\"hljs-string\">\"$MYSQL_POD\"<\/span> -- mysql -u petclinic -ppetclinic petclinic -e <span class=\"hljs-string\">\"SHOW TABLES;\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-63\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 7: Route Does Not Open<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Check Route<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-64\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route spring-petclinic\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-64\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If no route exists, create one:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose svc\/spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check service:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-65\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> svc spring-petclinic\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-65\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check endpoints:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-66\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> endpoints spring-petclinic\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-66\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If endpoints are empty, the Service is not pointing to a running pod.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check labels:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-67\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods --show-labels\noc describe svc spring-petclinic\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-67\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 8: BuildConfig Not Found<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Symptom<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-68\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> bc spring-petclinic\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-68\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Returns NotFound.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Possible Causes<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>You are in the wrong project.<\/li>\n\n\n\n<li>The app was not created from Git.<\/li>\n\n\n\n<li>The name is different.<\/li>\n\n\n\n<li>The import failed.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Fix<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Check current project:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Switch project:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab13-java-mysql\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">List all resources:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-69\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> all\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-69\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">List BuildConfigs:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-70\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> bc\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-70\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 28: Cleanup<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">To remove all lab resources, delete the project.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cleanup from Web Console<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Switch to the <strong>Administrator<\/strong> perspective.<\/li>\n\n\n\n<li>Go to <strong>Home > Projects<\/strong>.<\/li>\n\n\n\n<li>Select:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">lab13-java-mysql\n<\/code><\/span><\/pre>\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Click <strong>Delete Project<\/strong>.<\/li>\n\n\n\n<li>Confirm deletion.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Cleanup from CLI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-71\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> project lab13-java-mysql\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-71\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-72\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> project lab13-java-mysql\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-72\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected result:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-73\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">Error<\/span> <span class=\"hljs-keyword\">from<\/span> server (NotFound): projects.project.openshift.io <span class=\"hljs-string\">\"lab13-java-mysql\"<\/span> not found\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-73\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 29: Lab Summary<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In this lab, you deployed a complete Java and database application on OpenShift.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You created:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Resource<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>Secret<\/td><td>Stored MySQL credentials<\/td><\/tr><tr><td>PersistentVolumeClaim<\/td><td>Stored MySQL data<\/td><\/tr><tr><td>MySQL Deployment<\/td><td>Ran the database<\/td><\/tr><tr><td>MySQL Service<\/td><td>Provided internal database access<\/td><\/tr><tr><td>BuildConfig<\/td><td>Defined the Java source build<\/td><\/tr><tr><td>Build<\/td><td>Built the Java app image<\/td><\/tr><tr><td>ImageStream<\/td><td>Tracked the built image<\/td><\/tr><tr><td>Java Deployment<\/td><td>Ran Spring PetClinic<\/td><\/tr><tr><td>Java Service<\/td><td>Provided internal app access<\/td><\/tr><tr><td>Route<\/td><td>Exposed the app to the browser<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You verified that:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>MySQL runs inside OpenShift.<\/li>\n\n\n\n<li>MySQL has persistent storage.<\/li>\n\n\n\n<li>Spring PetClinic builds from Git source code.<\/li>\n\n\n\n<li>OpenShift S2I creates a runnable application image.<\/li>\n\n\n\n<li>The Java app connects to MySQL using the internal service name <code>mysql<\/code>.<\/li>\n\n\n\n<li>The app is available in the browser through an OpenShift Route.<\/li>\n\n\n\n<li>Data can be written to and read from MySQL.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 30: Review Questions<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Question 1<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">What is the purpose of Source-to-Image?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Source-to-Image builds a runnable container image by combining application source code with a builder image.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 2<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">What is the purpose of BuildConfig?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">BuildConfig defines how OpenShift builds the application, including the Git repository, build strategy, builder image, triggers, and output image.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 3<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">What is the purpose of ImageStream?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">ImageStream tracks the image built by OpenShift and allows the Deployment to consume that image.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 4<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Why does MySQL not have a Route?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">MySQL is an internal database service. It should normally be accessed only by applications inside the cluster through a Service.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 5<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">What is the internal hostname for MySQL?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mysql\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 6<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">What JDBC URL does Spring PetClinic use?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-74\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">jdbc:mysql:<span class=\"hljs-comment\">\/\/mysql:3306\/petclinic<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-74\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 7<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Which environment variable tells Spring Boot to use MySQL?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">SPRING_PROFILES_ACTIVE=mysql\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 8<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Which OpenShift resource exposes Spring PetClinic to the browser?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Route.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 9<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Which OpenShift resource stores MySQL data?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">PersistentVolumeClaim.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 10<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Which command shows the Java build logs?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs -f bc\/spring-petclinic\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 31: Instructor Notes<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This lab is designed as a modern replacement for the older Java PetClinic lab.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The original lab used:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Developer Sandbox.<\/li>\n\n\n\n<li>MySQL Ephemeral template.<\/li>\n\n\n\n<li>Simple direct environment variables.<\/li>\n\n\n\n<li>Minimal CLI validation.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">This replacement uses:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>OpenShift Local.<\/li>\n\n\n\n<li>MySQL Deployment.<\/li>\n\n\n\n<li>Secret for credentials.<\/li>\n\n\n\n<li>PVC for storage.<\/li>\n\n\n\n<li>Service for internal database access.<\/li>\n\n\n\n<li>S2I Java build from Git.<\/li>\n\n\n\n<li>Deployment instead of DeploymentConfig.<\/li>\n\n\n\n<li>Route for browser access.<\/li>\n\n\n\n<li>CLI validation.<\/li>\n\n\n\n<li>Troubleshooting.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">For production-grade Java\/database workloads, students should later learn:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Database Operators.<\/li>\n\n\n\n<li>Managed database services.<\/li>\n\n\n\n<li>Backup and restore.<\/li>\n\n\n\n<li>Secret rotation.<\/li>\n\n\n\n<li>TLS database connections.<\/li>\n\n\n\n<li>Readiness and liveness probes based on real commands.<\/li>\n\n\n\n<li>Resource tuning.<\/li>\n\n\n\n<li>Horizontal Pod Autoscaler for stateless app tier.<\/li>\n\n\n\n<li>NetworkPolicy.<\/li>\n\n\n\n<li>GitOps-based deployment.<\/li>\n\n\n\n<li>CI\/CD with OpenShift Pipelines.<\/li>\n\n\n\n<li>Image vulnerability scanning.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 32: Instructor Pre-Validation Checklist<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Before giving this lab to students, run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-75\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">crc status\noc whoami\noc <span class=\"hljs-keyword\">get<\/span> nodes\noc <span class=\"hljs-keyword\">get<\/span> storageclass\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-75\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create a test project:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-76\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-project lab13-validation\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-76\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply the MySQL YAML from this lab.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Validate MySQL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-77\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc rollout status deployment\/mysql\noc get pvc mysql-data\nMYSQL_POD=$(oc get pod -l app=mysql -o jsonpath=<span class=\"hljs-string\">'{.items&#91;0].metadata.name}'<\/span>)\noc exec <span class=\"hljs-string\">\"$MYSQL_POD\"<\/span> -- mysql -u petclinic -ppetclinic petclinic -e <span class=\"hljs-string\">\"SHOW DATABASES;\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-77\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then validate the Java build through the web console or CLI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Clean up:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-78\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> project lab13-validation\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-78\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If MySQL starts, the Java build completes, and the route opens successfully, the lab is ready for students.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Final Outcome<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You have successfully deployed a Java Spring Boot application with MySQL on OpenShift.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You now understand this complete OpenShift workflow:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-79\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">MySQL Secret\n  -&gt; MySQL PVC\n  -&gt; MySQL Deployment\n  -&gt; MySQL Service\n  -&gt; Java Source Code <span class=\"hljs-keyword\">from<\/span> Git\n  -&gt; S2I Build\n  -&gt; BuildConfig\n  -&gt; ImageStream\n  -&gt; Java Deployment\n  -&gt; Java Service\n  -&gt; Java Route\n  -&gt; Browser\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-79\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is a very important real-world pattern because many enterprise applications need both an application tier and a database tier, and OpenShift provides the tools to build, deploy, expose, and validate that workflow.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lab Objective In this lab, you will deploy a Java Spring Boot application on OpenShift using the OpenShift web console. You will deploy two components: The Java&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[5153],"tags":[],"class_list":["post-50022","post","type-post","status-publish","format-standard","hentry","category-openshift"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/50022","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=50022"}],"version-history":[{"count":7,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/50022\/revisions"}],"predecessor-version":[{"id":77171,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/50022\/revisions\/77171"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=50022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=50022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=50022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}