From 249869fce1137841a3f01d1ad6ab0b6d3f6a7bf7 Mon Sep 17 00:00:00 2001 From: Robert Patrick Date: Tue, 28 Mar 2023 08:08:13 -0500 Subject: [PATCH] initial commit of quickstart-supporting code --- samples/quickstart/app/pom.xml | 72 +++++ .../todo/services/TodoListApplication.java | 22 ++ .../java/org/todo/services/entity/Item.java | 48 ++++ .../todo/services/resource/ItemResource.java | 77 ++++++ .../todo/services/resource/ItemsResource.java | 114 ++++++++ .../app/src/main/webapp/WEB-INF/web.xml | 13 + .../app/src/main/webapp/css/todo-style.css | 111 ++++++++ .../quickstart/app/src/main/webapp/index.html | 140 ++++++++++ samples/quickstart/app/target/todo.war | Bin 0 -> 12480 bytes .../scripts/local-domain/archive.zip | Bin 0 -> 12656 bytes .../local-domain/createToDoListDomain.sh | 59 ++++ .../scripts/local-domain/model.yaml | 54 ++++ .../scripts/local-domain/startMySQL.sh | 62 +++++ .../scripts/local-domain/variables.properties | 6 + samples/quickstart/scripts/vzDeployMySQL.ps1 | 257 ++++++++++++++++++ samples/quickstart/scripts/vzDeployMySQL.sh | 206 ++++++++++++++ samples/quickstart/scripts/wkoDeployMySQL.ps1 | 218 +++++++++++++++ samples/quickstart/scripts/wkoDeployMySQL.sh | 170 ++++++++++++ samples/quickstart/setQuickstartEnv.ps1 | 73 +++++ samples/quickstart/setQuickstartEnv.sh | 98 +++++++ samples/quickstart/sql/init-schema.sql | 15 + 21 files changed, 1815 insertions(+) create mode 100644 samples/quickstart/app/pom.xml create mode 100644 samples/quickstart/app/src/main/java/org/todo/services/TodoListApplication.java create mode 100644 samples/quickstart/app/src/main/java/org/todo/services/entity/Item.java create mode 100644 samples/quickstart/app/src/main/java/org/todo/services/resource/ItemResource.java create mode 100644 samples/quickstart/app/src/main/java/org/todo/services/resource/ItemsResource.java create mode 100644 samples/quickstart/app/src/main/webapp/WEB-INF/web.xml create mode 100644 samples/quickstart/app/src/main/webapp/css/todo-style.css create mode 100644 samples/quickstart/app/src/main/webapp/index.html create mode 100644 samples/quickstart/app/target/todo.war create mode 100644 samples/quickstart/scripts/local-domain/archive.zip create mode 100755 samples/quickstart/scripts/local-domain/createToDoListDomain.sh create mode 100644 samples/quickstart/scripts/local-domain/model.yaml create mode 100755 samples/quickstart/scripts/local-domain/startMySQL.sh create mode 100644 samples/quickstart/scripts/local-domain/variables.properties create mode 100755 samples/quickstart/scripts/vzDeployMySQL.ps1 create mode 100755 samples/quickstart/scripts/vzDeployMySQL.sh create mode 100755 samples/quickstart/scripts/wkoDeployMySQL.ps1 create mode 100755 samples/quickstart/scripts/wkoDeployMySQL.sh create mode 100644 samples/quickstart/setQuickstartEnv.ps1 create mode 100644 samples/quickstart/setQuickstartEnv.sh create mode 100644 samples/quickstart/sql/init-schema.sql diff --git a/samples/quickstart/app/pom.xml b/samples/quickstart/app/pom.xml new file mode 100644 index 000000000..5492a3ea3 --- /dev/null +++ b/samples/quickstart/app/pom.xml @@ -0,0 +1,72 @@ + + + + + 4.0.0 + + com.oracle.weblogic.example + todo + 0.1-SNAPSHOT + war + todo + + + UTF-8 + 1.8 + 1.8 + + + + + javax.ws.rs + javax.ws.rs-api + 2.1.1 + provided + + + javax.json + javax.json-api + 1.1.4 + provided + + + + + todo + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.2.1 + + + enforce-build-environment + + enforce + + + + + 1.8.0 + You must use JDK 8 to build the project WebLogic 12.2.1.4 only supports JDK 8 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + + org.apache.maven.plugins + maven-war-plugin + 3.3.2 + + + + diff --git a/samples/quickstart/app/src/main/java/org/todo/services/TodoListApplication.java b/samples/quickstart/app/src/main/java/org/todo/services/TodoListApplication.java new file mode 100644 index 000000000..b46bc0c06 --- /dev/null +++ b/samples/quickstart/app/src/main/java/org/todo/services/TodoListApplication.java @@ -0,0 +1,22 @@ +// Copyright (c) 2020, 2023, Oracle and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package org.todo.services; + +import java.util.HashSet; +import java.util.Set; +import javax.ws.rs.ApplicationPath; +import javax.ws.rs.core.Application; + +import org.todo.services.resource.ItemResource; +import org.todo.services.resource.ItemsResource; + +@ApplicationPath("/rest") +public class TodoListApplication extends Application { + public Set> getClasses() { + Set> s = new HashSet<>(); + s.add(ItemsResource.class); + s.add(ItemResource.class); + return s; + } +} diff --git a/samples/quickstart/app/src/main/java/org/todo/services/entity/Item.java b/samples/quickstart/app/src/main/java/org/todo/services/entity/Item.java new file mode 100644 index 000000000..9c32658b8 --- /dev/null +++ b/samples/quickstart/app/src/main/java/org/todo/services/entity/Item.java @@ -0,0 +1,48 @@ +// Copyright (c) 2020, 2023, Oracle and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package org.todo.services.entity; + +import javax.json.Json; +import javax.json.JsonObject; + +public class Item { + private int key; + private String description; + private boolean complete; + + public Item(int id) { + key = id; + complete = false; + } + + public int id() { + return key; + } + + public String desc() { + return description; + } + + public Item desc(String value) { + description = value; + return this; + } + + public boolean done() { + return complete; + } + + public Item done(boolean value) { + complete = value; + return this; + } + + public JsonObject toJson() { + return Json.createObjectBuilder() + .add("id", id()) + .add( "description", desc()) + .add( "done", done()) + .build(); + } +} diff --git a/samples/quickstart/app/src/main/java/org/todo/services/resource/ItemResource.java b/samples/quickstart/app/src/main/java/org/todo/services/resource/ItemResource.java new file mode 100644 index 000000000..c1e09ccb8 --- /dev/null +++ b/samples/quickstart/app/src/main/java/org/todo/services/resource/ItemResource.java @@ -0,0 +1,77 @@ +// Copyright (c) 2020, 2023, Oracle and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package org.todo.services.resource; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import javax.json.JsonObject; +import javax.naming.NamingException; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; + +import org.todo.services.entity.Item; + +@Path("/item") +public class ItemResource { + + public final static String selectSql = "select task, completed from ToDos where taskId = %s"; + public final static String deleteSql = "delete from ToDos where taskId = %s"; + public final static String insertSql = "insert into ToDos(task, completed) values('%s', false);"; + public final static String updateSql = "update ToDos set completed = %s where taskId = %s"; + + @GET + @Path("/{id}") + @Produces("application/json") + public JsonObject item(@PathParam("id") String id) { + Item result = null; + try (Connection conn = ItemsResource.datasource().getConnection()) { + Statement statement = conn.createStatement(); + String queryStr = String.format(selectSql, id); + System.out.println(queryStr); + ResultSet resultSet = statement.executeQuery(queryStr); + if (resultSet.next()) { + String task = resultSet.getString("task"); + boolean complete = resultSet.getBoolean("completed"); + result = new Item(Integer.parseInt(id)).desc(task).done(complete); + } + } catch (SQLException | NamingException ex) { + ex.printStackTrace(); + } + return result == null ? null : result.toJson(); + } + + @DELETE + @Path("/{id}") + public void delete(@PathParam("id") String id) { + runQuery(String.format(deleteSql, id)); + } + + @PUT + @Path("/{taskDescription}") + public void addNewItem(@PathParam("taskDescription") String description) { + runQuery(String.format(insertSql, description)); + } + + @PUT + @Path("/{id}/{status}") + public void updateStatus(@PathParam("id") String id, @PathParam("status") String status) { + runQuery(String.format(updateSql, id, status)); + } + + private void runQuery(String query) { + try (Connection conn = ItemsResource.datasource().getConnection()) { + Statement statement = conn.createStatement(); + System.out.println(query); + statement.executeUpdate(query); + } catch (SQLException | NamingException ex) { + ex.printStackTrace(); + } + } +} diff --git a/samples/quickstart/app/src/main/java/org/todo/services/resource/ItemsResource.java b/samples/quickstart/app/src/main/java/org/todo/services/resource/ItemsResource.java new file mode 100644 index 000000000..e8f7976cf --- /dev/null +++ b/samples/quickstart/app/src/main/java/org/todo/services/resource/ItemsResource.java @@ -0,0 +1,114 @@ +// Copyright (c) 2020, 2023, Oracle and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package org.todo.services.resource; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; +import javax.json.Json; +import javax.json.JsonArray; +import javax.json.JsonArrayBuilder; +import javax.naming.InitialContext; +import javax.naming.NamingException; +import javax.sql.DataSource; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.todo.services.entity.Item; + +/** + * REST service for the To-Do list application using MySQL DB. + * /items retrieves the full list of tasks + * /items/init drops the table, creates the table, and loads the table with some starting tasks + */ +@Path("/items/") +@Produces(MediaType.APPLICATION_JSON) +public class ItemsResource { + + public static DataSource datasource() throws NamingException { + InitialContext ctx = new InitialContext(); + return (DataSource) ctx.lookup("jdbc/ToDoDB"); + } + + public List items() { + List result = new ArrayList<>(); + + try (Connection conn = datasource().getConnection()){ + Statement statement = conn.createStatement(); + ResultSet resultSet = statement.executeQuery("select taskId, task, completed from ToDos"); + while (resultSet.next()) { + int id = resultSet.getInt("taskId"); + String task = resultSet.getString("task"); + boolean complete = resultSet.getBoolean("completed"); + result.add(new Item(id).desc(task).done(complete)); + } + } catch (SQLException | NamingException ex) { + ex.printStackTrace(); + } + return result; + } + + @GET + public JsonArray itemsJson() { + JsonArrayBuilder result = Json.createArrayBuilder(); + for (Item item : items()) { + result.add(item.toJson()); + } + return result.build(); + } + + @GET + @Path("/drop/") + @Produces(MediaType.TEXT_PLAIN) + public Response dropTable() { + try (Connection conn = datasource().getConnection()) { + Statement stmt = conn.createStatement(); + + String dropTable = "drop table ToDos;"; + System.out.println(dropTable); + stmt.executeUpdate(dropTable); + } catch (SQLException | NamingException ex) { + // ok to fail, table may not exist yet. + return Response.ok().entity(ex.getLocalizedMessage() + "\n").build(); + } + return Response.ok().entity("ToDos table dropped.\n").build(); + } + + @GET + @Path("/init/") + @Produces(MediaType.TEXT_PLAIN) + public Response initTable() { + dropTable(); + try (Connection conn = datasource().getConnection()){ + Statement stmt = conn.createStatement(); + + String createTable = "create table ToDos (" + + "taskId INT NOT NULL AUTO_INCREMENT, " + + "task VARCHAR(200) NOT NULL, " + + "completed BOOLEAN," + + "constraint todo_pk PRIMARY KEY (taskId));"; + + System.out.println(createTable); + stmt.executeUpdate(createTable); + + String[] tasks = {"Install Verrazzano", "Move ToDo List to the cloud", "Celebrate", "Clean off my desk"}; + for (String task : tasks) { + String insert = String.format(ItemResource.insertSql, task); + System.out.println(insert); + stmt.executeUpdate(insert); + } + + } catch (SQLException | NamingException ex) { + ex.printStackTrace(); + return Response.serverError().entity("ERROR: " + ex.getLocalizedMessage() + "\n").build(); + } + return Response.ok().entity("ToDos table initialized.\n").build(); + } +} diff --git a/samples/quickstart/app/src/main/webapp/WEB-INF/web.xml b/samples/quickstart/app/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 000000000..a18010ce9 --- /dev/null +++ b/samples/quickstart/app/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,13 @@ + + + + + + Derek's ToDo List + + index.html + + diff --git a/samples/quickstart/app/src/main/webapp/css/todo-style.css b/samples/quickstart/app/src/main/webapp/css/todo-style.css new file mode 100644 index 000000000..19089bcc6 --- /dev/null +++ b/samples/quickstart/app/src/main/webapp/css/todo-style.css @@ -0,0 +1,111 @@ +/* Copyright (c) 2020, 2023, Oracle and/or its affiliates. */ +/* Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. */ + +* { + box-sizing: border-box; +} + +/* Remove margins and padding from the list */ +ul { + margin: 0; + padding: 0; +} + +ul li { + cursor: pointer; + position: relative; + padding: 12px 8px 12px 40px; + background: #eee; + font-size: 18px; + transition: 0.2s; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* Zebra stripes in the list */ +ul li:nth-child(odd) { + background: #f9f9f9; +} + +/* Darker background on hover */ +ul li:hover { + background: #ddd; +} + +/* strikethrough and color when checked status */ +ul li.checked { + background: #888; + color: #fff; + text-decoration: line-through; +} + +/* Add a check mark when clicked */ +ul li.checked::before { + content: ''; + position: absolute; + border-color: #fff; + border-style: solid; + border-width: 0 2px 2px 0; + top: 10px; + left: 16px; + transform: rotate(45deg); + height: 15px; + width: 7px; +} + +.close { + position: absolute; + right: 0; + top: 0; + padding: 12px 16px 12px 16px; +} + +.close:hover { + background-color: red; + color: white; +} + +.header { + background-color: #ff9223; + padding: 30px 40px; + color: white; + text-align: center; +} + +.header:after { + content: ""; + display: table; + clear: both; +} + +/* Style the task input field */ +input { + margin: 0; + border: none; + border-radius: 0; + width: 75%; + padding: 10px; + float: left; + font-size: 16px; +} + +/* Style the "Add" button */ +.addBtn { + padding: 10px; + width: 25%; + background: #d9d9d9; + color: #555; + float: left; + text-align: center; + font-size: 16px; + cursor: pointer; + transition: 0.3s; + border-radius: 0; +} + +.addBtn:hover { + background-color: #bbb; +} diff --git a/samples/quickstart/app/src/main/webapp/index.html b/samples/quickstart/app/src/main/webapp/index.html new file mode 100644 index 000000000..ff38f9b42 --- /dev/null +++ b/samples/quickstart/app/src/main/webapp/index.html @@ -0,0 +1,140 @@ + + + + + + Derek's To-Do List + + + + +
+

Derek's To-Do List

+ + Add +
+ +
    +
+ + + + diff --git a/samples/quickstart/app/target/todo.war b/samples/quickstart/app/target/todo.war new file mode 100644 index 0000000000000000000000000000000000000000..bb98847a3b5416a48180b3bce8612131e38e777d GIT binary patch literal 12480 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 M)N6BC`Zv)30~Mu^2><{9 literal 0 HcmV?d00001 diff --git a/samples/quickstart/scripts/local-domain/createToDoListDomain.sh b/samples/quickstart/scripts/local-domain/createToDoListDomain.sh new file mode 100755 index 000000000..c1cf81114 --- /dev/null +++ b/samples/quickstart/scripts/local-domain/createToDoListDomain.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env sh +# +# Copyright (c) 2023, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# This script is used to create a local WebLogic Server domain to use for +# discovering the model section of the WKTUI Quickstart. +# + +BASEDIR="$( cd "$( dirname "$0" )" && pwd )" +if [ -z "${WKTUI_QS_HOME}" ]; then + WKTUI_QS_HOME="$( cd "${BASEDIR}/../.." && pwd )"; export WKTUI_QS_HOME +fi + +if [ -z "${JAVA_HOME}" ]; then + echo "JAVA_HOME environment variable must be set. Please edit and source the ${WKTUI_QS_HOME}/setQuickstartEnv.sh file" >&2 + exit 1 +elif [ ! -d "${JAVA_HOME}" ]; then + echo "JAVA_HOME directory ${JAVA_HOME} does not exist...exiting" >&2 + exit 1 +fi + +if [ -z "${ORACLE_HOME}" ]; then + echo "ORACLE_HOME environment variable must be set. Please edit and source the ${WKTUI_QS_HOME}/setQuickstartEnv.sh file" >&2 + exit 1 +elif [ ! -d "${ORACLE_HOME}" ]; then + echo "ORACLE_HOME directory ${ORACLE_HOME} does not exist...exiting" >&2 + exit 1 +fi + +if [ -z "${WLSDEPLOY_HOME}" ]; then + echo "WLSDEPLOY_HOME environment variable must be set. Please edit and source the ${WKTUI_QS_HOME}/setQuickstartEnv.sh file" >&2 + exit 1 +elif [ ! -d "${WLSDEPLOY_HOME}" ]; then + echo "WLSDEPLOY_HOME directory ${WLSDEPLOY_HOME} does not exist...exiting" >&2 + exit 1 +fi + +if [ -d "${WKTUI_QS_HOME}/todolist_domain" ]; then + if ! rm -rf "${WKTUI_QS_HOME}/todolist_domain"; then + echo "Failed to delete existing domain directory ${WKTUI_QS_HOME}/todolist_domain...exiting" >&2 + exit 1 + fi +fi + +if ! "${WLSDEPLOY_HOME}/bin/createDomain.sh" -oracle_home "${ORACLE_HOME}" \ + -domain_parent "${WKTUI_QS_HOME}" \ + -model_file "${BASEDIR}/model.yaml" \ + -variable_file "${BASEDIR}/variables.properties" \ + -archive_file "${BASEDIR}/archive.zip"; then + echo "" >&2 + echo "Failed to create the domain at ${WKTUI_QS_HOME}/todolist_domain...exiting" >&2 + echo "" >&2 + exit 1 +else + echo "" + echo "Successfully created the domain at ${WKTUI_QS_HOME}/todolist_domain" + echo "" +fi diff --git a/samples/quickstart/scripts/local-domain/model.yaml b/samples/quickstart/scripts/local-domain/model.yaml new file mode 100644 index 000000000..d6f9551c9 --- /dev/null +++ b/samples/quickstart/scripts/local-domain/model.yaml @@ -0,0 +1,54 @@ +# +# Copyright (c) 2023, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +domainInfo: + AdminUserName: '@@PROP:WebLogicAdminUserName@@' + AdminPassword: '@@PROP:WebLogicAdminPassword@@' +topology: + Name: todolist_domain + ProductionModeEnabled: true + AdminServerName: AdminServer + Server: + AdminServer: + Cluster: + mycluster: + DynamicServers: + ServerTemplate: todo-srv-template + ServerNamePrefix: 'ToDoServer-' + DynamicClusterSize: 10 + MaxDynamicClusterSize: 10 + CalculatedListenPorts: false + MinDynamicClusterSize: 0 + ServerTemplate: + 'todo-srv-template': + ListenPortEnabled: true + Cluster: mycluster +resources: + JDBCSystemResource: + myDataSource: + JdbcResource: + JDBCDriverParams: + Properties: + user: + Value: weblogic + DriverName: com.mysql.cj.jdbc.Driver + URL: 'jdbc:mysql://localhost:3306/tododb' + PasswordEncrypted: welcome1 + JDBCDataSourceParams: + JNDIName: [ + jdbc/ToDoDB + ] + + DatasourceType: GENERIC + Target: [ + mycluster + ] + +appDeployments: + Application: + todo: + Target: [ + mycluster + ] + SourcePath: wlsdeploy/applications/todo.war diff --git a/samples/quickstart/scripts/local-domain/startMySQL.sh b/samples/quickstart/scripts/local-domain/startMySQL.sh new file mode 100755 index 000000000..e02f9f0bc --- /dev/null +++ b/samples/quickstart/scripts/local-domain/startMySQL.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env sh +# +# Copyright (c) 2023, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# This script starts up a MySQL database in a container using the +# host's networking (to make it simpler). There is no persistence +# directory so any changes made to the data can be reset by simply +# restarting the container. +# + +BASEDIR="$( cd "$( dirname "$0" )" && pwd )" +if [ -z "${WKTUI_QS_HOME}" ]; then + WKTUI_QS_HOME="$( cd "${BASEDIR}/../.." && pwd )"; export WKTUI_QS_HOME +fi + +if [ -z "${IMAGE_BUILDER_NAME}" ]; then + echo "IMAGE_BUILDER_NAME environment variable must be set. Please edit and source the ${WKTUI_QS_HOME}/setQuickstartEnv.sh file" >&2 + exit 1 +elif [ -z "${IMAGE_BUILDER_EXE}" ]; then + echo "IMAGE_BUILDER_EXE environment variable must be set. Please edit and source the ${WKTUI_QS_HOME}/setQuickstartEnv.sh file" >&2 + exit 1 +fi + +if [ -z "${ORCL_SSO_USER}" ]; then + printf "Please enter your Oracle SSO account username: " + read -r ORCL_SSO_USER + if [ -z "${ORCL_SSO_USER}" ]; then + echo "No Oracle SSO account username provided...exiting" >&2 + exit 1 + fi +fi + +if [ -z "${ORCL_SSO_PASS}" ]; then + stty -echo + printf "Please enter your Oracle SSO account password: " + read -r ORCL_SSO_USER + stty echo + if [ -z "${ORCL_SSO_PASS}" ]; then + echo "No Oracle SSO account password provided...exiting" >&2 + exit 1 + fi +fi + +if ! echo "${ORCL_SSO_PASS}" | "${IMAGE_BUILDER_EXE}" login container-registry.oracle.com \ + -u "${ORCL_SSO_USER}" --password-stdin; then + echo "Failed to ${IMAGE_BUILDER_NAME} login to container-registry.oracle.com...exiting" >&2 + exit 1 +fi + +if ! "${IMAGE_BUILDER_EXE}" run \ + --name=mysql \ + --network=host \ + -e MYSQL_ROOT_PASSWORD=manager1 \ + -e MYSQL_USER=weblogic \ + -e MYSQL_PASSWORD=welcome1 \ + -e MYSQL_DATABASE=tododb \ + --mount type=bind,src="${WKTUI_QS_HOME}/sql/",dst=/docker-entrypoint-initdb.d/ \ + -d container-registry.oracle.com/mysql/community-server:8.0.32; then + echo "Failed to start MySQL database container...exiting" >&2 + exit 1 +fi diff --git a/samples/quickstart/scripts/local-domain/variables.properties b/samples/quickstart/scripts/local-domain/variables.properties new file mode 100644 index 000000000..7b1584c0f --- /dev/null +++ b/samples/quickstart/scripts/local-domain/variables.properties @@ -0,0 +1,6 @@ +# +# Copyright (c) 2023, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +WebLogicAdminUserName=weblogic +WebLogicAdminPassword=welcome1 diff --git a/samples/quickstart/scripts/vzDeployMySQL.ps1 b/samples/quickstart/scripts/vzDeployMySQL.ps1 new file mode 100755 index 000000000..e74f246b7 --- /dev/null +++ b/samples/quickstart/scripts/vzDeployMySQL.ps1 @@ -0,0 +1,257 @@ +<# + Copyright (c) 2023, Oracle and/or its affiliates. + Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +#> +$BASEDIR = $PSScriptRoot +if (-not $env:WKTUI_QS_HOME) { + $env:WKTUI_QS_HOME = (get-item $BASEDIR).parent.FullName +} + +$MYSQL_NAMESPACE = "todolist-domain-ns" +$SECRET_NAME = "ocr" +$MYSQL_SECRET_NAME = "mysql" +$MYSQL_ROOT_PASS_NAME = "rootPass" +$MYSQL_WL_USER_NAME = "username" +$MYSQL_WL_USER_PASS = "password" +$CONFIG_MAP_NAME = "todolist-mysql-cm" +$KUBECTL_EXE = (get-command kubectl.exe).Path + +if (-not $env:ORCL_SSO_USER) { + $env:ORCL_SSO_USER = Read-Host "Please enter your Oracle SSO account username: " + if (-not $env:ORCL_SSO_USER) { + Write-Error "No Oracle SSO account username provided...exiting" + exit 1 + } +} + +if (-not $env:ORCL_SSO_PASS) { + $ORCL_SSO_PASS = Read-Host "Please enter your Oracle SSO account password: " -AsSecureString + if (-not $ORCL_SSO_PASS) { + Write-Error "No Oracle SSO account password provided...exiting" + exit 1 + } + $env:ORCL_SSO_PASS = [Runtime.InteropServices.Marshal]::PtrToStringAuto( + [Runtime.InteropServices.Marshal]::SecureStringToBSTR($ORCL_SSO_PASS)) +} + +# +# Create namespace if it doesn't already exist +# + +$proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList "get namespace $MYSQL_NAMESPACE" ` + -PassThru -RedirectStandardError "NUL" -RedirectStandardOutput "$env:TEMP\stdout" +Wait-Process -InputObject $proc +if ($proc.ExitCode -ne 0) { + Write-Output "MySQL image pull secret namespace $MYSQL_NAMESPACE does not exist...creating" + $proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList ` + "create namespace $MYSQL_NAMESPACE" -PassThru + Wait-Process -InputObject $proc + if ($proc.ExitCode -ne 0) { + Write-Error "Failed to create MySQL image pull secret namespace $MYSQL_NAMESPACE...exiting" + exit 1 + } +} + +# +# Create the ocr image pull secret if it doesn't already exist +# + +$proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList ` + "get secret $SECRET_NAME -n $MYSQL_NAMESPACE" -PassThru -RedirectStandardError "NUL" ` + -RedirectStandardOutput "$env:TEMP\stdout" +Wait-Process -InputObject $proc +if ($proc.ExitCode -eq 0) { + Write-Output "MySQL image pull secret $SECRET_NAME already exists in namespace $MYSQL_NAMESPACE...skipping" +} else { + $argList = "create secret docker-registry $SECRET_NAME -n $MYSQL_NAMESPACE " ` + + "--docker-server=container-registry.oracle.com " ` + + "--docker-username=`"$env:ORCL_SSO_USER`" " ` + + "--docker-password=`"$env:ORCL_SSO_PASS`" " ` + + "--docker-email=`"$env:ORCL_SSO_USER`" " + + $proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList "$argList" -PassThru + Wait-Process -InputObject $proc + if ($proc.ExitCode -ne 0) { + Write-Error "Failed to create MySQL image pull secret $SECRET_NAME in namespace $MYSQL_NAMESPACE...exiting" + exit 1 + } +} + +# +# Create MySQL Secret to initialize MySQL user and password +# + +$proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList ` + "get secret $MYSQL_SECRET_NAME -n $MYSQL_NAMESPACE" -PassThru ` + -RedirectStandardError "NUL" -RedirectStandardOutput "$env:TEMP\stdout" +Wait-Process -InputObject $proc +if ($proc.ExitCode -eq 0) { + Write-Output "MySQL secret $MYSQL_SECRET_NAME already exists in namespace $MYSQL_NAMESPACE...skipping" +} else { + $argList = "create secret generic $MYSQL_SECRET_NAME -n $MYSQL_NAMESPACE " ` + + "--from-literal=$MYSQL_ROOT_PASS_NAME=manager1 " ` + + "--from-literal=$MYSQL_WL_USER_NAME=weblogic " ` + + "--from-literal=$MYSQL_WL_USER_PASS=welcome1" + + $proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList "$argList" -PassThru + Wait-Process -InputObject $proc + if ($proc.ExitCode -ne 0) { + Write-Error "Failed to create MySQL secret $MYSQL_SECRET_NAME in namespace $MYSQL_NAMESPACE...exiting" + exit 1 + } +} + +# +# Create the MySQL config map component +# + +$tmp_file = Join-Path -Path "$env:TEMP" -ChildPath "\todolist-vz-mysql-configmap.yaml" +@" +apiVersion: core.oam.dev/v1alpha2 +kind: Component +metadata: + name: $CONFIG_MAP_NAME + namespace: $MYSQL_NAMESPACE +spec: + workload: + apiVersion: v1 + kind: ConfigMap + metadata: + name: $CONFIG_MAP_NAME + namespace: $MYSQL_NAMESPACE + data: + init-schema.sql: | + CREATE TABLE ToDos (taskId INT NOT NULL AUTO_INCREMENT, + task VARCHAR(200) NOT NULL, + completed BOOLEAN, + constraint todo_pk PRIMARY KEY (taskId)); + INSERT INTO ToDos (task, completed) + VALUES + ('Install WKTUI', FALSE), + ('Install Verrazzano', FALSE), + ('Move ToDo List to the the cloud', FALSE), + ('Celebrate', FALSE), + ('Clean off my desk', FALSE); +"@ > $tmp_file + +$proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList "apply -f $tmp_file" -PassThru +Wait-Process -InputObject $proc +if ($proc.ExitCode -ne 0) { + Write-Error "Failed to create Component $CONFIG_MAP_NAME in namespace $MYSQL_NAMESPACE...exiting" + exit 1 +} + +if (Test-Path "$tmp_file") { + Remove-Item -Path "$tmp_file" -Force +} + +# +# Create the MySQL deployment component +# + +$tmp_file = Join-Path -Path "$env:TEMP" -ChildPath "\todolist-vz-mysql-deployment.yaml" +@" +apiVersion: core.oam.dev/v1alpha2 +kind: Component +metadata: + name: todolist-mysql-deployment + namespace: $MYSQL_NAMESPACE +spec: + workload: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: todolist-mysql-deployment + namespace: $MYSQL_NAMESPACE + labels: + app: todolist-mysql + spec: + replicas: 1 + selector: + matchLabels: + app: todolist-mysql + template: + metadata: + labels: + app: todolist-mysql + spec: + containers: + - name: todolist-mysql + image: container-registry.oracle.com/mysql/community-server:8.0.32 + ports: + - containerPort: 3306 + volumeMounts: + - name: init-sql + mountPath: /docker-entrypoint-initdb.d/ + env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: $MYSQL_SECRET_NAME + key: $MYSQL_ROOT_PASS_NAME + - name: MYSQL_USER + valueFrom: + secretKeyRef: + name: $MYSQL_SECRET_NAME + key: $MYSQL_WL_USER_NAME + - name: MYSQL_PASSWORD + valueFrom: + secretKeyRef: + name: $MYSQL_SECRET_NAME + key: $MYSQL_WL_USER_PASS + - name: MYSQL_DATABASE + value: tododb + volumes: + - name: init-sql + configMap: + name: $CONFIG_MAP_NAME + imagePullSecrets: + - name: $SECRET_NAME +"@ > $tmp_file + +$proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList "apply -f $tmp_file" -PassThru +Wait-Process -InputObject $proc +if ($proc.ExitCode -ne 0) { + Write-Error "Failed to create Component todolist-mysql-deployment in namespace $MYSQL_NAMESPACE...exiting" + exit 1 +} + +if (Test-Path "$tmp_file") { + Remove-Item -Path "$tmp_file" -Force +} + +# +# Create the MySQL service component +# + +$tmp_file = Join-Path -Path "$env:TEMP" -ChildPath "\todolist-vz-mysql-deployment.yaml" +@" +apiVersion: core.oam.dev/v1alpha2 +kind: Component +metadata: + name: todolist-mysql-service + namespace: $MYSQL_NAMESPACE +spec: + workload: + apiVersion: v1 + kind: Service + metadata: + name: mysql + namespace: $MYSQL_NAMESPACE + spec: + selector: + app: todolist-mysql + ports: + - port: 3306 +"@ > $tmp_file + +$proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList "apply -f $tmp_file" -PassThru +Wait-Process -InputObject $proc +if ($proc.ExitCode -ne 0) { + Write-Error "Failed to create Component todolist-mysql-service in namespace $MYSQL_NAMESPACE...exiting" + exit 1 +} + +if (Test-Path "$tmp_file") { + Remove-Item -Path "$tmp_file" -Force +} diff --git a/samples/quickstart/scripts/vzDeployMySQL.sh b/samples/quickstart/scripts/vzDeployMySQL.sh new file mode 100755 index 000000000..567de552b --- /dev/null +++ b/samples/quickstart/scripts/vzDeployMySQL.sh @@ -0,0 +1,206 @@ +#!/usr/bin/env sh +# +# Copyright (c) 2023, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +BASEDIR="$( cd "$( dirname "$0" )" && pwd )" +if [ -z "${WKTUI_QS_HOME}" ]; then + WKTUI_QS_HOME="$( cd "${BASEDIR}/.." && pwd )"; export WKTUI_QS_HOME +fi + +MYSQL_NAMESPACE=todolist-domain-ns +SECRET_NAME=ocr +MYSQL_SECRET_NAME=mysql +MYSQL_ROOT_PASS_NAME=rootPass +MYSQL_WL_USER_NAME=username +MYSQL_WL_USER_PASS=password +CONFIG_MAP_NAME=todolist-mysql-cm + +if [ -z "${ORCL_SSO_USER}" ]; then + printf "Please enter your Oracle SSO account username: " + read -r ORCL_SSO_USER + if [ -z "${ORCL_SSO_USER}" ]; then + echo "No Oracle SSO account username provided...exiting" >&2 + exit 1 + fi +fi + +if [ -z "${ORCL_SSO_PASS}" ]; then + stty -echo + printf "Please enter your Oracle SSO account password: " + read -r ORCL_SSO_USER + stty echo + if [ -z "${ORCL_SSO_PASS}" ]; then + echo "No Oracle SSO account password provided...exiting" >&2 + exit 1 + fi +fi + +# +# Create namespace if it doesn't already exist +# + +if ! kubectl get namespace "${MYSQL_NAMESPACE}" > /dev/null 2>&1; then + echo "MySQL image pull secret namespace ${MYSQL_NAMESPACE} does not exist...creating" + if ! kubectl create namespace "${MYSQL_NAMESPACE}"; then + echo "Failed to create MySQL image pull secret namespace ${MYSQL_NAMESPACE}...exiting" >&2 + exit 1 + fi +fi + +# +# Create the ocr image pull secret if it doesn't already exist +# + +if kubectl get secret "${SECRET_NAME}" -n "${MYSQL_NAMESPACE}" > /dev/null 2>&1; then + echo "MySQL image pull secret ${SECRET_NAME} already exists in namespace ${MYSQL_NAMESPACE}...skipping" +elif ! kubectl create secret docker-registry "${SECRET_NAME}" -n "${MYSQL_NAMESPACE}" \ + --docker-server=container-registry.oracle.com \ + --docker-username="${ORCL_SSO_USER}" \ + --docker-password="${ORCL_SSO_PASS}" \ + --docker-email="${ORCL_SSO_USER}"; then + echo "Failed to create MySQL image pull secret ${SECRET_NAME} in namespace ${MYSQL_NAMESPACE}...exiting" >&2 + exit 1 +fi + +# +# Create MySQL Secret to initialize MySQL user and password +# + +if kubectl get secret "${MYSQL_SECRET_NAME}" -n "${MYSQL_NAMESPACE}" > /dev/null 2>&1; then + echo "MySQL secret ${MYSQL_SECRET_NAME} already exists in namespace ${MYSQL_NAMESPACE}...skipping" +elif ! kubectl create secret generic "${MYSQL_SECRET_NAME}" -n "${MYSQL_NAMESPACE}" \ + --from-literal=${MYSQL_ROOT_PASS_NAME}=manager1 \ + --from-literal=${MYSQL_WL_USER_NAME}=weblogic \ + --from-literal=${MYSQL_WL_USER_PASS}=welcome1; then + echo "Failed to create MySQL secret ${MYSQL_SECRET_NAME} in namespace ${MYSQL_NAMESPACE}...exiting" >&2 + exit 1 +fi + +# +# Create the MySQL config map component +# + +if ! kubectl apply -f - <&2 + exit 1 +fi + +# +# Create the MySQL deployment component +# + +if ! kubectl apply -f - <&2 + exit 1 +fi + +# +# Create the MySQL service component +# + +if ! kubectl apply -f - <&2 + exit 1 +fi diff --git a/samples/quickstart/scripts/wkoDeployMySQL.ps1 b/samples/quickstart/scripts/wkoDeployMySQL.ps1 new file mode 100755 index 000000000..14f2b3dbe --- /dev/null +++ b/samples/quickstart/scripts/wkoDeployMySQL.ps1 @@ -0,0 +1,218 @@ +<# + Copyright (c) 2023, Oracle and/or its affiliates. + Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +#> +$BASEDIR = $PSScriptRoot +if (-not $env:WKTUI_QS_HOME) { + $env:WKTUI_QS_HOME = (get-item $BASEDIR).parent.FullName +} + +$MYSQL_NAMESPACE = "todolist-domain-ns" +$SECRET_NAME = "ocr" +$MYSQL_SECRET_NAME = "mysql" +$MYSQL_ROOT_PASS_NAME = "rootPass" +$MYSQL_WL_USER_NAME = "username" +$MYSQL_WL_USER_PASS = "password" +$CONFIG_MAP_NAME = "todolist-mysql-cm" +$KUBECTL_EXE = (get-command kubectl.exe).Path + +if (-not $env:ORCL_SSO_USER) { + $env:ORCL_SSO_USER = Read-Host "Please enter your Oracle SSO account username: " + if (-not $env:ORCL_SSO_USER) { + Write-Error "No Oracle SSO account username provided...exiting" + exit 1 + } +} + +if (-not $env:ORCL_SSO_PASS) { + $ORCL_SSO_PASS = Read-Host "Please enter your Oracle SSO account password: " -AsSecureString + if (-not $ORCL_SSO_PASS) { + Write-Error "No Oracle SSO account password provided...exiting" + exit 1 + } + $env:ORCL_SSO_PASS = [Runtime.InteropServices.Marshal]::PtrToStringAuto( + [Runtime.InteropServices.Marshal]::SecureStringToBSTR($ORCL_SSO_PASS)) +} + +# +# Create namespace if it doesn't already exist +# + +$proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList "get namespace $MYSQL_NAMESPACE" ` + -PassThru -RedirectStandardError "NUL" -RedirectStandardOutput "$env:TEMP\stdout" +Wait-Process -InputObject $proc +if ($proc.ExitCode -ne 0) { + Write-Output "MySQL image pull secret namespace $MYSQL_NAMESPACE does not exist...creating" + $proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList ` + "create namespace $MYSQL_NAMESPACE" -PassThru + Wait-Process -InputObject $proc + if ($proc.ExitCode -ne 0) { + Write-Error "Failed to create MySQL image pull secret namespace $MYSQL_NAMESPACE...exiting" + exit 1 + } +} + +# +# Create the ocr image pull secret if it doesn't already exist +# + +$proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList "get secret $SECRET_NAME -n $MYSQL_NAMESPACE" ` + -PassThru -RedirectStandardError "NUL" -RedirectStandardOutput "$env:TEMP\stdout" +Wait-Process -InputObject $proc +if ($proc.ExitCode -eq 0) { + Write-Output "MySQL image pull secret $SECRET_NAME already exists in namespace $MYSQL_NAMESPACE...skipping" +} else { + $argList = "create secret docker-registry $SECRET_NAME -n $MYSQL_NAMESPACE " ` + + "--docker-server=container-registry.oracle.com " ` + + "--docker-username=`"$env:ORCL_SSO_USER`" " ` + + "--docker-password=`"$env:ORCL_SSO_PASS`" " ` + + "--docker-email=`"$env:ORCL_SSO_USER`" " + + $proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList "$argList" -PassThru + Wait-Process -InputObject $proc + if ($proc.ExitCode -ne 0) { + Write-Error "Failed to create MySQL image pull secret $SECRET_NAME in namespace $MYSQL_NAMESPACE...exiting" + exit 1 + } +} + +# +# Create MySQL Secret to initialize MySQL user and password +# + +$proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList "get secret $MYSQL_SECRET_NAME -n $MYSQL_NAMESPACE" ` + -PassThru -RedirectStandardError "NUL" -RedirectStandardOutput "$env:TEMP\stdout" +Wait-Process -InputObject $proc +if ($proc.ExitCode -eq 0) { + Write-Output "MySQL secret $MYSQL_SECRET_NAME already exists in namespace $MYSQL_NAMESPACE...skipping" +} else { + $argList = "create secret generic $MYSQL_SECRET_NAME -n $MYSQL_NAMESPACE " ` + + "--from-literal=$MYSQL_ROOT_PASS_NAME=manager1 " ` + + "--from-literal=$MYSQL_WL_USER_NAME=weblogic " ` + + "--from-literal=$MYSQL_WL_USER_PASS=welcome1" + + $proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList "$argList" -PassThru + Wait-Process -InputObject $proc + if ($proc.ExitCode -ne 0) { + Write-Error "Failed to create MySQL secret $MYSQL_SECRET_NAME in namespace $MYSQL_NAMESPACE...exiting" + exit 1 + } +} + +# +# Create the MySQL config map that holds the initialization SQL script if it does not already exist +# + +$INIT_SCRIPT_DIR = Join-Path -Path "$env:WKTUI_QS_HOME" -ChildPath "\sql\" +$proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList "get cm $CONFIG_MAP_NAME -n $MYSQL_NAMESPACE" ` + -PassThru -RedirectStandardError "NUL" -RedirectStandardOutput "$env:TEMP\stdout" +Wait-Process -InputObject $proc +if ($proc.ExitCode -eq 0) { + Write-Output "MySQL config map $CONFIG_MAP_NAME already exists in namespace $MYSQL_NAMESPACE...skipping" +} else { + $argList = "create cm $CONFIG_MAP_NAME -n $MYSQL_NAMESPACE --from-file=${INIT_SCRIPT_DIR}" + + $proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList "$argList" -PassThru + Wait-Process -InputObject $proc + if ($proc.ExitCode -ne 0) { + Write-Error "Failed to create MySQL config map $CONFIG_MAP_NAME in namespace $MYSQL_NAMESPACE...exiting" + exit 1 + } +} + +# +# Create the MySQL deployment +# + +$tmp_file = Join-Path -Path "$env:TEMP" -ChildPath "\todolist-mysql-deployment.yaml" +@" +apiVersion: apps/v1 +kind: Deployment +metadata: + name: todolist-mysql-deployment + namespace: $MYSQL_NAMESPACE + labels: + app: todolist-mysql +spec: + replicas: 1 + selector: + matchLabels: + app: todolist-mysql + template: + metadata: + namespace: $MYSQL_NAMESPACE + labels: + app: todolist-mysql + spec: + containers: + - name: todolist-mysql + image: container-registry.oracle.com/mysql/community-server:8.0.32 + ports: + - containerPort: 3306 + volumeMounts: + - name: init-sql + mountPath: /docker-entrypoint-initdb.d/ + env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: $MYSQL_SECRET_NAME + key: $MYSQL_ROOT_PASS_NAME + - name: MYSQL_USER + valueFrom: + secretKeyRef: + name: $MYSQL_SECRET_NAME + key: $MYSQL_WL_USER_NAME + - name: MYSQL_PASSWORD + valueFrom: + secretKeyRef: + name: $MYSQL_SECRET_NAME + key: $MYSQL_WL_USER_PASS + - name: MYSQL_DATABASE + value: tododb + volumes: + - name: init-sql + configMap: + name: $CONFIG_MAP_NAME + imagePullSecrets: + - name: $SECRET_NAME +"@ > $tmp_file + +$proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList "apply -f $tmp_file" -PassThru +Wait-Process -InputObject $proc +if ($proc.ExitCode -ne 0) { + Write-Error "Failed to create MySQL deployment todolist-mysql-deployment in namespace $MYSQL_NAMESPACE...exiting" + exit 1 +} + +if (Test-Path "$tmp_file") { + Remove-Item -Path "$tmp_file" -Force +} + +# +# Create the MySQL service +# + +$tmp_file = Join-Path -Path "$env:TEMP" -ChildPath "\todolist-mysql-service.yaml" +@" +apiVersion: v1 +kind: Service +metadata: + name: mysql + namespace: ${MYSQL_NAMESPACE} +spec: + selector: + app: todolist-mysql + ports: + - port: 3306 +"@ > $tmp_file +$proc = Start-Process -NoNewWindow -FilePath "$KUBECTL_EXE" -ArgumentList "apply -f $tmp_file" -PassThru +Wait-Process -InputObject $proc +if ($proc.ExitCode -ne 0) { + Write-Error "Failed to create MySQL service mysql in namespace $MYSQL_NAMESPACE...exiting" + exit 1 +} + +if (Test-Path "$tmp_file") { + Remove-Item -Path "$tmp_file" -Force +} diff --git a/samples/quickstart/scripts/wkoDeployMySQL.sh b/samples/quickstart/scripts/wkoDeployMySQL.sh new file mode 100755 index 000000000..df75dfa9a --- /dev/null +++ b/samples/quickstart/scripts/wkoDeployMySQL.sh @@ -0,0 +1,170 @@ +#!/usr/bin/env sh +# +# Copyright (c) 2023, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +BASEDIR="$( cd "$( dirname "$0" )" && pwd )" +if [ -z "${WKTUI_QS_HOME}" ]; then + WKTUI_QS_HOME="$( cd "${BASEDIR}/.." && pwd )"; export WKTUI_QS_HOME +fi + +MYSQL_NAMESPACE=todolist-domain-ns +SECRET_NAME=ocr +MYSQL_SECRET_NAME=mysql +MYSQL_ROOT_PASS_NAME=rootPass +MYSQL_WL_USER_NAME=username +MYSQL_WL_USER_PASS=password +CONFIG_MAP_NAME=todolist-mysql-cm + +if [ -z "${ORCL_SSO_USER}" ]; then + printf "Please enter your Oracle SSO account username: " + read -r ORCL_SSO_USER + if [ -z "${ORCL_SSO_USER}" ]; then + echo "No Oracle SSO account username provided...exiting" >&2 + exit 1 + fi +fi + +if [ -z "${ORCL_SSO_PASS}" ]; then + stty -echo + printf "Please enter your Oracle SSO account password: " + read -r ORCL_SSO_USER + stty echo + if [ -z "${ORCL_SSO_PASS}" ]; then + echo "No Oracle SSO account password provided...exiting" >&2 + exit 1 + fi +fi + +# +# Create namespace if it doesn't already exist +# + +if ! kubectl get namespace "${MYSQL_NAMESPACE}" > /dev/null 2>&1; then + echo "MySQL image pull secret namespace ${MYSQL_NAMESPACE} does not exist...creating" + if ! kubectl create namespace "${MYSQL_NAMESPACE}"; then + echo "Failed to create MySQL image pull secret namespace ${MYSQL_NAMESPACE}...exiting" >&2 + exit 1 + fi +fi + +# +# Create the ocr image pull secret if it doesn't already exist +# + +if kubectl get secret "${SECRET_NAME}" -n "${MYSQL_NAMESPACE}" > /dev/null 2>&1; then + echo "MySQL image pull secret ${SECRET_NAME} already exists in namespace ${MYSQL_NAMESPACE}...skipping" +elif ! kubectl create secret docker-registry "${SECRET_NAME}" -n "${MYSQL_NAMESPACE}" \ + --docker-server=container-registry.oracle.com \ + --docker-username="${ORCL_SSO_USER}" \ + --docker-password="${ORCL_SSO_PASS}" \ + --docker-email="${ORCL_SSO_USER}"; then + echo "Failed to create MySQL image pull secret ${SECRET_NAME} in namespace ${MYSQL_NAMESPACE}...exiting" >&2 + exit 1 +fi + +# +# Create MySQL Secret to initialize MySQL user and password +# + +if kubectl get secret "${MYSQL_SECRET_NAME}" -n "${MYSQL_NAMESPACE}" > /dev/null 2>&1; then + echo "MySQL secret ${MYSQL_SECRET_NAME} already exists in namespace ${MYSQL_NAMESPACE}...skipping" +elif ! kubectl create secret generic "${MYSQL_SECRET_NAME}" -n "${MYSQL_NAMESPACE}" \ + --from-literal=${MYSQL_ROOT_PASS_NAME}=manager1 \ + --from-literal=${MYSQL_WL_USER_NAME}=weblogic \ + --from-literal=${MYSQL_WL_USER_PASS}=welcome1; then + echo "Failed to create MySQL secret ${MYSQL_SECRET_NAME} in namespace ${MYSQL_NAMESPACE}...exiting" >&2 + exit 1 +fi + +# +# Create the MySQL config map that holds the initialization SQL script if it does not already exist +# + +INIT_SCRIPT_DIR="${WKTUI_QS_HOME}/sql/" + +if kubectl get cm "${CONFIG_MAP_NAME}" -n "${MYSQL_NAMESPACE}" 2> /dev/null; then + echo "MySQL config map ${CONFIG_MAP_NAME} already exists in namespace ${MYSQL_NAMESPACE}...skipping" +elif ! kubectl create cm "${CONFIG_MAP_NAME}" -n "${MYSQL_NAMESPACE}" --from-file="${INIT_SCRIPT_DIR}"; then + echo "Failed to create MySQL config map ${CONFIG_MAP_NAME} in namespace ${MYSQL_NAMESPACE}...exiting" >&2 + exit 1 +fi + +# +# Create the MySQL deployment +# + +if ! kubectl apply -f - <&2 + exit 1 +fi + +# +# Create the MySQL service +# + +if ! kubectl apply -f - <&2 + exit 1 +fi diff --git a/samples/quickstart/setQuickstartEnv.ps1 b/samples/quickstart/setQuickstartEnv.ps1 new file mode 100644 index 000000000..0627d543b --- /dev/null +++ b/samples/quickstart/setQuickstartEnv.ps1 @@ -0,0 +1,73 @@ +<# + Copyright (c) 2020, 2023, Oracle and/or its affiliates. + Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + + This script sets up the required environment for working with the + WebLogic Kubernetes Toolkit UI Quickstart scripts and application build. +#> + +############################################################# +# EDIT THIS SECTION TO MATCH YOUR ENVIRONMENT # +############################################################# + +# +# Set to the JDK 11 installation directory or delete +# if JAVA_HOME is already set in your environment +# +$env:JAVA_HOME = "c:\path\to\jdk\install\directory" + +# +# Set to the Apache Maven directory or delete +# if M2_HOME is already set in your environment or +# if you do not plan to recompile the sample application +# +$env:M2_HOME = "c:\path\to\apache\maven\install\directory" + +# +# Set to the location of the WebLogic Server installation or delete +# if the ORACLE_HOME is already set in to point to the correct +# location in your environment. +# +$env:ORACLE_HOME = "c:\path\to\wls_14.1.1\install\directory" + +# +# Set to directory where WKTUI is installed. +# +# On Windows, this will typically be: +# +# $env:WKTUI_HOME="c:\Program Files\WebLogic Kubernetes Toolkit UI" +# +$env:WKTUI_HOME = "c:\Program Files\WebLogic Kubernetes Toolkit UI" + +# +# Set to the username of your Oracle SSO account. This is +# used to pull images from https://container-registry.oracle.com. +# +# Feel free to delete this variable and the other scripts +# will prompt you for the username. +# +$env:ORCL_SSO_USER = "jim.smith@mycompany.com" + +# +# Set to the password of your Oracle SSO account. This is +# used to pull images from https://container-registry.oracle.com. +# +# Feel free to delete this variable and the other scripts +# will prompt you for the password. +# +$env:ORCL_SSO_PASS = 'welcome1' + +# +# Set to the name of the program you are using to create +# container images (i.e., docker or podman) +# +$env:IMAGE_BUILDER_EXE=docker + +############################################################# +# DO NOT EDIT BELOW HERE # +############################################################# + +if (-not $env:WKTUI_QS_HOME) { + $env:WKTUI_QS_HOME = (get-item $PSScriptRoot).FullName +} +$env:WLSDEPLOY_HOME = Join-Path -Path "$env:WKTUI_HOME" -ChildPath "\tools\weblogic-deploy" diff --git a/samples/quickstart/setQuickstartEnv.sh b/samples/quickstart/setQuickstartEnv.sh new file mode 100644 index 000000000..859088ed7 --- /dev/null +++ b/samples/quickstart/setQuickstartEnv.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env sh +# +# Copyright (c) 2020, 2023, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# This script sets up the required environment for working with the +# WebLogic Kubernetes Toolkit UI Quickstart scripts and application build. +# + +############################################################# +# EDIT THIS SECTION TO MATCH YOUR ENVIRONMENT # +############################################################# + +# +# Set to the JDK 11 installation directory or delete +# if JAVA_HOME is already set in your environment +# +JAVA_HOME=/path/to/jdk/install/directory +export JAVA_HOME + +# +# Set to the Apache Maven directory or delete +# if M2_HOME is already set in your environment or +# if you do not plan to recompile the sample application +# +M2_HOME=/path/to/apache/maven/install/directory +export M2_HOME + +# +# Set to the location of the WebLogic Server installation or delete +# if the ORACLE_HOME is already set in to point to the correct +# location in your environment. +# +ORACLE_HOME=/path/to/wls_14.1.1/install/directory +export ORACLE_HOME + +# +# Set to directory where WKTUI is installed. +# +# On macOS, this will typically be: +# +# WKTUI_HOME="/Applications/WebLogic Kubernetes Toolkit UI.app" +# +WKTUI_HOME=/path/to/wktui/install/directory +export WKTUI_HOME + +# +# Set to the username of your Oracle SSO account. This is +# used to pull images from https://container-registry.oracle.com. +# +# Feel free to delete this variable and the other scripts +# will prompt you for the username. +# +ORCL_SSO_USER=jim.smith@mycompany.com +export ORCL_SSO_USER + +# +# Set to the password of your Oracle SSO account. This is +# used to pull images from https://container-registry.oracle.com. +# +# Feel free to delete this variable and the other scripts +# will prompt you for the password. +# +ORCL_SSO_PASS='welcome1' +export ORCL_SSO_PASS + +# +# Set to the name of the program you are using to create +# container images (i.e., docker or podman) +# +IMAGE_BUILDER_NAME=docker +export IMAGE_BUILDER_NAME + +############################################################# +# DO NOT EDIT BELOW HERE # +############################################################# + +WKTUI_QS_HOME="$( cd "$( dirname "$0" )" && pwd )"; export WKTUI_QS_HOME + +platform=$(uname) +if [ "${platform}" = "Darwin" ]; then + WLSDEPLOY_HOME="${WKTUI_HOME}/Contents/tools/weblogic-deploy" +else + WLSDEPLOY_HOME="${WKTUI_HOME}/tools/weblogic-deploy" +fi +export WLSDEPLOY_HOME + +if [ -n "${IMAGE_BUILDER_NAME}" ]; then + IMAGE_BUILDER_EXE=$(command -v "${IMAGE_BUILDER_NAME}") + if [ -z "${IMAGE_BUILDER_EXE}" ]; then + echo "Unable to find ${IMAGE_BUILDER_NAME} on the PATH...exiting" >&2 + exit 1 + elif [ ! -x "${IMAGE_BUILDER_EXE}" ]; then + echo "${IMAGE_BUILDER_EXE} is not executable...exiting" >&2 + exit 1 + fi + export IMAGE_BUILDER_EXE +fi diff --git a/samples/quickstart/sql/init-schema.sql b/samples/quickstart/sql/init-schema.sql new file mode 100644 index 000000000..31c472e17 --- /dev/null +++ b/samples/quickstart/sql/init-schema.sql @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2020, 2023, Oracle and/or its affiliates. + * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + */ +CREATE TABLE ToDos (taskId INT NOT NULL AUTO_INCREMENT, + task VARCHAR(200) NOT NULL, + completed BOOLEAN, + constraint todo_pk PRIMARY KEY (taskId)); +INSERT INTO ToDos (task, completed) +VALUES + ('Install WKTUI', FALSE), + ('Install Verrazzano', FALSE), + ('Move ToDo List to the the cloud', FALSE), + ('Celebrate', FALSE), + ('Clean off my desk', FALSE);