From b68a3a8e587312eacfb830cf332f3a669a55accc Mon Sep 17 00:00:00 2001 From: Dev <732525+devdattakulkarni@users.noreply.github.com> Date: Tue, 4 Jun 2024 13:42:39 -0500 Subject: [PATCH 1/4] Github action update - installing KubePlus chart from deploy dir (#1292) Github action update - installing KubePlus chart from deploy dir --- .github/workflows/pr.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index db060f8d..2697e2e9 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -34,7 +34,7 @@ jobs: echo "API_SERVER_URL:$apiserver" python3 provider-kubeconfig.py -s $apiserver create $KUBEPLUS_NS deactivate - helm install kubeplus "https://github.com/cloud-ark/operatorcharts/blob/master/kubeplus-chart-3.0.39.tgz?raw=true" --kubeconfig=kubeplus-saas-provider.json -n $KUBEPLUS_NS + helm install kubeplus ./deploy/kubeplus-chart --kubeconfig=kubeplus-saas-provider.json -n $KUBEPLUS_NS until kubectl get pods -A | grep kubeplus | grep Running; do echo "Waiting for KubePlus to start.."; sleep 1; done kubectl upload chart ./examples/multitenancy/application-hosting/wordpress/wordpress-chart-0.0.3.tgz kubeplus-saas-provider.json echo "Sleeping for 10 seconds before continuing..." From b629437d996c5519f354c62cebd280dc4844e752 Mon Sep 17 00:00:00 2001 From: Darkhan Suleimenov <104409273+dsuleimenov@users.noreply.github.com> Date: Wed, 5 Jun 2024 01:57:45 +0500 Subject: [PATCH 2/4] Remove reference to parse-api-server-url.sh from help text (#1293) --- provider-kubeconfig.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/provider-kubeconfig.py b/provider-kubeconfig.py index 49728250..0bf1a309 100644 --- a/provider-kubeconfig.py +++ b/provider-kubeconfig.py @@ -740,8 +740,9 @@ def _generate_kubeconfig(self, sa, namespace, filename, api_server_ip='', kubeco The default value is ~/.kube/config''') parser.add_argument("-s", "--apiserverurl", help='''This flag is to be used to pass the API Server URL of the API server on which KubePlus is installed. This API Server URL will be used in constructing the - server endpoint in the provider kubeconfig. Use the parse-api-server-url.sh script available in KubePlus repo - to get the API Server URL.''') + server endpoint in the provider kubeconfig. Use the command + `kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}'` + to retrieve the API Server URL.''') parser.add_argument("-f", "--filename", help='''This flag is used to specify the output file name in which generated provider kubeconfig will be store (The default value is kubeplus-saas-provider.json)''') From 3a102467601559104fc9c0662e9e0fb1f070483c Mon Sep 17 00:00:00 2001 From: Dev <732525+devdattakulkarni@users.noreply.github.com> Date: Wed, 5 Jun 2024 15:31:28 -0500 Subject: [PATCH 3/4] Updates to helmer and tests (#1296) Added a check in helm-pod to ensure that creation of a Custom Resource instance does not trigger helm upgrade after the status of the CR is updated. (Fixes: #1294) Updated tests to cleanup relevant namespaces before running tests --- deploy/kubeplus-chart/values.yaml | 4 +- mutating-webhook/utils.go | 4 +- mutating-webhook/versions.txt | 1 + mutating-webhook/webhook.go | 12 +++- platform-operator/helm-pod/main.go | 73 ++++++++++++++++++------- platform-operator/helm-pod/versions.txt | 1 + tests/tests.py | 6 ++ 7 files changed, 74 insertions(+), 27 deletions(-) diff --git a/deploy/kubeplus-chart/values.yaml b/deploy/kubeplus-chart/values.yaml index 9aec64c4..52848161 100644 --- a/deploy/kubeplus-chart/values.yaml +++ b/deploy/kubeplus-chart/values.yaml @@ -3,8 +3,8 @@ CHECK_KYVERNO_POLICIES: NO # Containers WEBHOOK_INIT_CONTAINER: gcr.io/cloudark-kubeplus/webhook-tls-getter:3.0.28 CRD_REGISTRATION_HELPER: gcr.io/cloudark-kubeplus/kubeconfiggenerator:3.0.28 -MUTATING_WEBHOOK: gcr.io/cloudark-kubeplus/pac-mutating-admission-webhook:3.0.14 +MUTATING_WEBHOOK: gcr.io/cloudark-kubeplus/pac-mutating-admission-webhook:3.0.15 PLATFORM_OPERATOR: gcr.io/cloudark-kubeplus/platform-operator:3.0.6 CONSUMERUI: gcr.io/cloudark-kubeplus/consumerui:0.0.7 -HELMER: gcr.io/cloudark-kubeplus/helm-pod:3.0.19 +HELMER: gcr.io/cloudark-kubeplus/helm-pod:3.0.20 RESOURCE_CLEANER: gcr.io/cloudark-kubeplus/delete-kubeplus-resources:3.0.28 diff --git a/mutating-webhook/utils.go b/mutating-webhook/utils.go index fb90608e..47d44041 100644 --- a/mutating-webhook/utils.go +++ b/mutating-webhook/utils.go @@ -853,7 +853,7 @@ func CheckApplicationNodeName(nodeName string) bool { // http://10.80.10.160:90/apis/kubeplus/deploy?platformworkflow=hello-world-service-composition&customresource=hello-world-tenant1&namespace=default&overrides={"greeting":"Hello Kubernauts - This is KubePlus"} // http://10.80.10.160:90/apis/kubeplus/deploy?platformworkflow=hello-world-service-composition&customresource=hello-world-tenant1&namespace=default&overrides={"greeting":"Hi"} -func QueryDeployEndpoint(platformworkflow, customresource, namespace, overrides, cpu_req, cpu_lim, mem_req, mem_lim string) []byte { +func QueryDeployEndpoint(platformworkflow, customresource, namespace, overrides, cpu_req, cpu_lim, mem_req, mem_lim, labels string) []byte { encodedOverrides := url.QueryEscape(overrides) //fp, _ := os.Create("/crdinstances/" + platformworkflow + "-" + customresource) //fp.WriteString(encodedOverrides) @@ -861,7 +861,7 @@ func QueryDeployEndpoint(platformworkflow, customresource, namespace, overrides, CreateOverrides(platformworkflow, customresource) - args := fmt.Sprintf("platformworkflow=%s&customresource=%s&namespace=%s&overrides=%s&cpu_req=%s&cpu_lim=%s&mem_req=%s&mem_lim=%s", platformworkflow, customresource, namespace, encodedOverrides, cpu_req, cpu_lim, mem_req, mem_lim) + args := fmt.Sprintf("platformworkflow=%s&customresource=%s&namespace=%s&overrides=%s&cpu_req=%s&cpu_lim=%s&mem_req=%s&mem_lim=%s&labels=%s", platformworkflow, customresource, namespace, encodedOverrides, cpu_req, cpu_lim, mem_req, mem_lim,labels) fmt.Printf("Inside QueryDeployEndpoint...\n") var url1 string url1 = fmt.Sprintf("http://%s:%s/apis/kubeplus/deploy?%s", serviceHost, servicePort, args) diff --git a/mutating-webhook/versions.txt b/mutating-webhook/versions.txt index f8f9782a..6e4b2d9e 100644 --- a/mutating-webhook/versions.txt +++ b/mutating-webhook/versions.txt @@ -26,3 +26,4 @@ 3.0.12 3.0.13 3.0.14 +3.0.15 diff --git a/mutating-webhook/webhook.go b/mutating-webhook/webhook.go index 18319f6e..37a3da02 100644 --- a/mutating-webhook/webhook.go +++ b/mutating-webhook/webhook.go @@ -453,7 +453,9 @@ func handleDelete(ar *v1.AdmissionReview) *v1.AdmissionResponse { for _, instanceObj := range crdObjList.Items { objData := instanceObj.UnstructuredContent() status := objData["status"] - if status == nil { + labels := instanceObj.GetLabels() + forcedDelete, _ := labels["delete"] + if status == nil && forcedDelete == "" { return &v1.AdmissionResponse{ Result: &metav1.Status{ Message: "Error: ResourceComposition instance cannot be deleted. It has an application instance starting up.", @@ -1367,6 +1369,12 @@ func handleCustomAPIs(ar *v1.AdmissionReview) *v1.AdmissionResponse { cruid := id.String() //fmt.Printf("CR Uid:%s\n", cruid) + labelsBytes, _, _, _ := jsonparser.Get(req.Object.Raw, "metadata", "labels") + labels := string(labelsBytes) + fmt.Printf("******\n") + fmt.Printf("labels:%s\n", labels) + fmt.Printf("******\n") + overridesBytes, _, _, _ := jsonparser.Get(req.Object.Raw, "spec") overrides := string(overridesBytes) fmt.Printf("******\n") @@ -1469,7 +1477,7 @@ func handleCustomAPIs(ar *v1.AdmissionReview) *v1.AdmissionResponse { fp.Close() deploymentStatus := QueryDeployEndpoint(platformWorkflowName, crname, namespace, overrides, cpu_requests_q, - cpu_limits_q, mem_requests_q, mem_limits_q) + cpu_limits_q, mem_requests_q, mem_limits_q, labels) if string(deploymentStatus) != "" { diff --git a/platform-operator/helm-pod/main.go b/platform-operator/helm-pod/main.go index e5612a3b..d02bf127 100644 --- a/platform-operator/helm-pod/main.go +++ b/platform-operator/helm-pod/main.go @@ -17,6 +17,7 @@ import ( "context" "io/fs" "path/filepath" + "encoding/json" "os" "k8s.io/client-go/dynamic" @@ -187,7 +188,7 @@ func getChartValues(request *restful.Request, response *restful.Response) { readCmd := "cat " + chartValuesPath fmt.Printf("cat cmd:%s\n", readCmd) _, valuesToReturn = executeExecCall(cmdRunnerPod, readCmd) - fmt.Printf("valuesToReturn:%v\n",valuesToReturn) + //fmt.Printf("valuesToReturn:%v\n",valuesToReturn) } response.Write([]byte(valuesToReturn)) @@ -327,12 +328,14 @@ func deleteCRDInstances(request *restful.Request, response *restful.Response) { continue; } - fmt.Printf("objData:%v\n", objData) + //fmt.Printf("objData:%v\n", objData) status := objData["status"] - fmt.Printf("Status:%v\n", status) - if status != nil { + //fmt.Printf("Status:%v\n", status) + //labels := instanceObj.GetLabels() + //forcedDelete, _ := labels["delete"] + if status != nil { //|| forcedDelete != "" { helmreleaseNS, helmrelease := getHelmReleaseName(status) - fmt.Printf("Helm release:%s, %s\n", helmreleaseNS, helmrelease) + fmt.Printf("Helm release NS and release name:%s, %s\n", helmreleaseNS, helmrelease) if helmreleaseNS != "" && helmrelease != "" { // Do in the background as 'helm delete' and deleting NS are time consuming actions go func() { @@ -347,7 +350,8 @@ func deleteCRDInstances(request *restful.Request, response *restful.Response) { if helmreleaseNS != namespace { namespaceDeleteCmd := "./root/kubectl delete ns " + helmreleaseNS cmdRunnerPod := getKubePlusPod() - executeExecCall(cmdRunnerPod, namespaceDeleteCmd) + _, op := executeExecCall(cmdRunnerPod, namespaceDeleteCmd) + fmt.Printf("kubectl delete ns o/p:%v\n", op) } }() @@ -356,6 +360,8 @@ func deleteCRDInstances(request *restful.Request, response *restful.Response) { dynamicClient.Resource(ownerRes).Namespace(namespace).Delete(context.Background(), objName, metav1.DeleteOptions{}) } } + //fmt.Printf("Deleting the object %s\n", objName) + //dynamicClient.Resource(ownerRes).Namespace(namespace).Delete(context.Background(), objName, metav1.DeleteOptions{}) } else { response.Write([]byte("Error: Custom Resource instance cannot be deleted. It is not ready yet.")) return @@ -376,7 +382,7 @@ func deleteCRDInstances(request *restful.Request, response *restful.Response) { } func deleteHelmRelease(helmreleaseNS, helmrelease string) bool { - fmt.Printf("Helm release:%s\n", helmrelease) + //fmt.Printf("Helm release:%s\n", helmrelease) cmd := "helm delete " + helmrelease + " -n " + helmreleaseNS fmt.Printf("Helm delete cmd:%s\n", cmd) var output string @@ -748,7 +754,7 @@ func getHelmReleaseName(object interface{}) (string, string) { key = strings.TrimSpace(key) if key == "helmrelease" { helmrelease = element.(string) - fmt.Printf("Helm release1:%s\n", helmrelease) + //fmt.Printf("Helm release1:%s\n", helmrelease) lines := strings.Split(helmrelease, "\n") releaseLine := strings.TrimSpace(lines[0]) parts := strings.Split(releaseLine,":") @@ -798,6 +804,7 @@ func deployChart(request *restful.Request, response *restful.Response) { cpu_lim := request.QueryParameter("cpu_lim") mem_req := request.QueryParameter("mem_req") mem_lim := request.QueryParameter("mem_lim") + labels := request.QueryParameter("labels") if err != nil { fmt.Printf("Error encountered in decoding overrides:%v\n", err) fmt.Printf("Not continuing...") @@ -808,8 +815,25 @@ func deployChart(request *restful.Request, response *restful.Response) { fmt.Printf("Custom Resource:%s\n", customresource) fmt.Printf("Resource Composition:%s\n", platformWorkflowName) fmt.Printf("Namespace:%s\n", namespace) - fmt.Printf("Overrides:%s\n", overrides) + //fmt.Printf("Overrides:%s\n", overrides) fmt.Printf("Dryrun:%s\n", dryrun) + fmt.Printf("Labels:%s\n", labels) + + if labels != "" { + + labelsMap := map[string]interface{}{} + if err := json.Unmarshal([]byte(labels), &labelsMap); err != nil { + panic(err) + } + //fmt.Println("LabelsMap:%v\n",labelsMap) + isCreatedByKubePlus, ok := labelsMap["created-by"] + if ok && isCreatedByKubePlus == "kubeplus" { + // This is the call triggered by creation of CRD instance. + // Nothing to do. + response.Write([]byte(string(""))) + return + } + } kinds := make([]string, 0) //ok := false @@ -828,7 +852,7 @@ func deployChart(request *restful.Request, response *restful.Response) { resourceCompositionNS := KUBEPLUS_NAMESPACE platformWorkflow1, err := sampleclientset.WorkflowsV1alpha1().ResourceCompositions(resourceCompositionNS).Get(context.Background(), platformWorkflowName, metav1.GetOptions{}) - fmt.Printf("PlatformWorkflow:%v\n", platformWorkflow1) + //fmt.Printf("PlatformWorkflow:%v\n", platformWorkflow1) if err != nil { fmt.Errorf("Error:%s\n", err) } @@ -841,7 +865,7 @@ func deployChart(request *restful.Request, response *restful.Response) { plural := customAPI.Resource.Plural chartURL := customAPI.ChartURL chartName := customAPI.ChartName - fmt.Printf("Kind:%s, Group:%s, Version:%s, Plural:%s, ChartURL:%s\n ChartName:%s", kind, group, version, plural, chartURL, chartName) + fmt.Printf("Kind:%s, Group:%s, Version:%s, Plural:%s, ChartURL:%s\n ChartName:%s", kind, group, version, plural, chartURL, chartName) kinddetails := kindDetails{ Group: group, @@ -1001,16 +1025,16 @@ func runHelmInstall(cmdRunnerPod, helmInstallCmd, releaseNameInCmd, kind, group, } } if releaseFound { - statusToUpdate := releaseName + "\n" + notes - go updateStatus(kind, group, version, plural, customresource, crObjNamespace, targetNSName, statusToUpdate) + //statusToUpdate := releaseName + "\n" + notes + go updateStatus(kind, group, version, plural, customresource, crObjNamespace, targetNSName, releaseName, notes) if (cpu_req != "" && cpu_lim != "" && mem_req != "" && mem_lim != "") { go createResourceQuota(targetNSName, releaseName, cpu_req, cpu_lim, mem_req, mem_lim) } go createNetworkPolicy(targetNSName, releaseName) } } else { - statusToUpdate := releaseNameInCmd + "\n" + execOutput - go updateStatus(kind, group, version, plural, customresource, crObjNamespace, targetNSName, statusToUpdate) + //statusToUpdate := releaseNameInCmd + "\n" + execOutput + go updateStatus(kind, group, version, plural, customresource, crObjNamespace, targetNSName, releaseNameInCmd, execOutput) errOp := string(execOutput) instanceExists := strings.Contains(errOp, "cannot re-use a name that is still in use") if !instanceExists { @@ -1122,11 +1146,11 @@ func untarChart(chartName2, cmdRunnerPod, namespace string) string { untarCmd := "tar -xvzf " + chartName2 fmt.Printf("untar cmd:%s\n", untarCmd) _, op := executeExecCall(cmdRunnerPod, untarCmd) - fmt.Printf("Untar output:%s",op) + //fmt.Printf("Untar output:%s",op) lines := strings.Split(op, "\n") chartName := "" parts := strings.Split(lines[0],"/") - fmt.Printf("ABC:%v",parts) + //fmt.Printf("ABC:%v",parts) chartName = strings.TrimSpace(parts[0]) fmt.Printf("Chart Name:%s\n", chartName) @@ -1135,7 +1159,8 @@ func untarChart(chartName2, cmdRunnerPod, namespace string) string { return chartName } -func updateStatus(kind, group, version, plural, instance, crdObjNS, targetNS, releaseName string) { +func updateStatus(kind, group, version, plural, instance, crdObjNS, targetNS, releaseName, notes string) { + fmt.Println("Inside updateStatus") res := schema.GroupVersionResource{Group: group, Version: version, @@ -1148,18 +1173,24 @@ func updateStatus(kind, group, version, plural, instance, crdObjNS, targetNS, re count := 0 for { obj, err := dynamicClient.Resource(res).Namespace(crdObjNS).Get(context.Background(), instance, metav1.GetOptions{}) - fmt.Printf("Error:%v\n", err) - fmt.Printf("Obj:%v\n",obj) + //fmt.Printf("Error:%v\n", err) + //fmt.Printf("Obj:%v\n",obj) if err == nil { objData := obj.UnstructuredContent() helmrelease := make(map[string]interface{},0) // Helm release will be done in the target namespace where the customresource instance // is deployed. releaseName = strings.ReplaceAll(releaseName, "\n", "") - helmrelease["helmrelease"] = targetNS + ":" + releaseName + helmrelease["helmrelease"] = targetNS + ":" + releaseName + "\n" + notes objData["status"] = helmrelease //fmt.Printf("objData:%v\n",objData) obj.SetUnstructuredContent(objData) + currentLabels := obj.GetLabels() + if currentLabels == nil { + currentLabels = make(map[string]string,1) + } + currentLabels["created-by"] = "kubeplus" + obj.SetLabels(currentLabels) dynamicClient.Resource(res).Namespace(crdObjNS).Update(context.Background(), obj, metav1.UpdateOptions{}) //fmt.Printf("UpdatedObj:%v, err1:%v\n",updatedObj, err1) //add the respective variables if want to print. // break out of the for loop diff --git a/platform-operator/helm-pod/versions.txt b/platform-operator/helm-pod/versions.txt index 8276e31f..a2ac5525 100644 --- a/platform-operator/helm-pod/versions.txt +++ b/platform-operator/helm-pod/versions.txt @@ -33,3 +33,4 @@ 3.0.17 3.0.18 3.0.19 +3.0.20 diff --git a/tests/tests.py b/tests/tests.py index 101f0380..86b15cac 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -83,6 +83,9 @@ def test_application_update(self): if not TestKubePlus._is_kubeplus_running(): print("KubePlus is not running. Deploy KubePlus and then run tests") sys.exit(0) + + start_clean = "kubectl delete ns hs1" + TestKubePlus.run_command(start_clean) kubeplus_home = os.getenv("KUBEPLUS_HOME") #print("KubePlus home:" + kubeplus_home) @@ -176,6 +179,9 @@ def test_res_comp_with_no_podpolicies(self): print("KubePlus is not running. Deploy KubePlus and then run tests") sys.exit(0) + start_clean = "kubectl delete ns tenant1" + TestKubePlus.run_command(start_clean) + cmd = "kubectl create -f wordpress-service-composition-chart-nopodpolicies.yaml --kubeconfig=../kubeplus-saas-provider.json" TestKubePlus.run_command(cmd) crd = "wordpressservices.platformapi.kubeplus" From 6ab456e38917617ee84b46a391809e23a4fb9c6a Mon Sep 17 00:00:00 2001 From: Dev <732525+devdattakulkarni@users.noreply.github.com> Date: Wed, 5 Jun 2024 15:45:20 -0500 Subject: [PATCH 4/4] KubePlus chart - 3.0.40 (#1297) --- README.md | 2 +- deploy/kubeplus-chart/Chart.yaml | 4 ++-- examples/multitenancy/application-hosting/odoo/steps.txt | 2 +- examples/multitenancy/application-hosting/wordpress/steps.txt | 2 +- examples/multitenancy/hello-world/steps.txt | 2 +- examples/multitenancy/managed-service/appday2ops/steps.txt | 2 +- examples/multitenancy/platform-engineering/steps.txt | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index d5d56db1..a30a9dfc 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ Let’s look at an example of creating a multi-instance WordPress Service using 5. Install KubePlus Operator using the generated provider kubeconfig ``` - helm install kubeplus "https://github.com/cloud-ark/operatorcharts/blob/master/kubeplus-chart-3.0.39.tgz?raw=true" --kubeconfig=kubeplus-saas-provider.json -n $KUBEPLUS_NS + helm install kubeplus "https://github.com/cloud-ark/operatorcharts/blob/master/kubeplus-chart-3.0.40.tgz?raw=true" --kubeconfig=kubeplus-saas-provider.json -n $KUBEPLUS_NS until kubectl get pods -A | grep kubeplus | grep Running; do echo "Waiting for KubePlus to start.."; sleep 1; done ``` diff --git a/deploy/kubeplus-chart/Chart.yaml b/deploy/kubeplus-chart/Chart.yaml index 7f2bccc8..59f6c9c6 100644 --- a/deploy/kubeplus-chart/Chart.yaml +++ b/deploy/kubeplus-chart/Chart.yaml @@ -7,10 +7,10 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 3.0.39 +version: 3.0.40 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. -appVersion: 02f1c1ad7d2bc01818abc435b296ee90d51b45a2 +appVersion: 3a102467601559104fc9c0662e9e0fb1f070483c diff --git a/examples/multitenancy/application-hosting/odoo/steps.txt b/examples/multitenancy/application-hosting/odoo/steps.txt index 9016f762..ab98a27f 100644 --- a/examples/multitenancy/application-hosting/odoo/steps.txt +++ b/examples/multitenancy/application-hosting/odoo/steps.txt @@ -20,7 +20,7 @@ This example shows delivering Bitnami Odoo Helm chart as-a-service using KubePlu $ python ../../../provider-kubeconfig.py create default -s $server - Install KubePlus - $ helm install kubeplus "https://github.com/cloud-ark/operatorcharts/blob/master/kubeplus-chart-3.0.39.tgz?raw=true" --kubeconfig=kubeplus-saas-provider.json + $ helm install kubeplus "https://github.com/cloud-ark/operatorcharts/blob/master/kubeplus-chart-3.0.40.tgz?raw=true" --kubeconfig=kubeplus-saas-provider.json - Wait till KubePlus Pod is Running $ kubectl get pods -A diff --git a/examples/multitenancy/application-hosting/wordpress/steps.txt b/examples/multitenancy/application-hosting/wordpress/steps.txt index e3ddda18..6d63b0f1 100644 --- a/examples/multitenancy/application-hosting/wordpress/steps.txt +++ b/examples/multitenancy/application-hosting/wordpress/steps.txt @@ -29,7 +29,7 @@ $ kubectl kubeplus commands $ cd examples/multitenancy/wordpress/ 4. Install KubePlus Operator: - $ helm install kubeplus "https://github.com/cloud-ark/operatorcharts/blob/master/kubeplus-chart-3.0.39.tgz?raw=true" -n $KUBEPLUS_NS --kubeconfig=kubeplus-saas-provider.json + $ helm install kubeplus "https://github.com/cloud-ark/operatorcharts/blob/master/kubeplus-chart-3.0.40.tgz?raw=true" -n $KUBEPLUS_NS --kubeconfig=kubeplus-saas-provider.json 5. Extract consumer kubeconfig: $ kubectl retrieve kubeconfig consumer $KUBEPLUS_NS -s $apiserver > consumer.conf diff --git a/examples/multitenancy/hello-world/steps.txt b/examples/multitenancy/hello-world/steps.txt index 832eeb17..886b6813 100644 --- a/examples/multitenancy/hello-world/steps.txt +++ b/examples/multitenancy/hello-world/steps.txt @@ -31,7 +31,7 @@ $ apiserver=`kubectl config view --minify -o jsonpath='{.clusters[0].cluster.ser $ python3 provider-kubeconfig.py -s $apiserver create $KUBEPLUS_NS $ cp kubeplus-saas-provider.json examples/multitenancy/hello-world/provider.conf $ cd examples/multitenancy/hello-world/ -$ helm install kubeplus "https://github.com/cloud-ark/operatorcharts/blob/master/kubeplus-chart-3.0.39.tgz?raw=true" -n $KUBEPLUS_NS --kubeconfig=provider.conf +$ helm install kubeplus "https://github.com/cloud-ark/operatorcharts/blob/master/kubeplus-chart-3.0.40.tgz?raw=true" -n $KUBEPLUS_NS --kubeconfig=provider.conf $ kubectl get pods (wait till kubeplus pod is Running) diff --git a/examples/multitenancy/managed-service/appday2ops/steps.txt b/examples/multitenancy/managed-service/appday2ops/steps.txt index 17900d14..6bfbde8c 100644 --- a/examples/multitenancy/managed-service/appday2ops/steps.txt +++ b/examples/multitenancy/managed-service/appday2ops/steps.txt @@ -19,7 +19,7 @@ Install KubePlus Operator: $ KUBEPLUS_NS=default $ python ../../../provider-kubeconfig.py create $KUBEPLUS_NS $ cp kubeplus-saas-provider.json provider.conf -$ helm install kubeplus "https://github.com/cloud-ark/operatorcharts/blob/master/kubeplus-chart-3.0.39.tgz?raw=true" -n $KUBEPLUS_NS --kubeconfig=provider.conf +$ helm install kubeplus "https://github.com/cloud-ark/operatorcharts/blob/master/kubeplus-chart-3.0.40.tgz?raw=true" -n $KUBEPLUS_NS --kubeconfig=provider.conf $ kubectl get pods (wait till kubeplus pod is Running) Install KubePlus kubectl plugins: diff --git a/examples/multitenancy/platform-engineering/steps.txt b/examples/multitenancy/platform-engineering/steps.txt index 7c239474..eff0fa2c 100644 --- a/examples/multitenancy/platform-engineering/steps.txt +++ b/examples/multitenancy/platform-engineering/steps.txt @@ -29,7 +29,7 @@ Platform Engineering team $ python ../../../provider-kubeconfig.py create default -s $server - Install KubePlus - $ helm install kubeplus "https://github.com/cloud-ark/operatorcharts/blob/master/kubeplus-chart-3.0.39.tgz?raw=true" --kubeconfig=kubeplus-saas-provider.json + $ helm install kubeplus "https://github.com/cloud-ark/operatorcharts/blob/master/kubeplus-chart-3.0.40.tgz?raw=true" --kubeconfig=kubeplus-saas-provider.json - Wait till KubePlus Pod is Running $ kubectl get pods -A