Compare commits

..

30 Commits

Author SHA1 Message Date
keptn 763dc1aee6 Updated resource 2023-11-15 15:55:06 +00:00
keptn 98629c5b1a Updated resource 2023-11-15 14:35:44 +00:00
keptn 7022ca76e9 Updated resource 2023-11-15 11:56:53 +00:00
keptn 328e655855 Updated resource 2023-11-15 07:32:48 +00:00
keptn 9353c3c71a Updated resource 2023-11-15 07:24:30 +00:00
keptn f3342655f8 Updated resource 2023-11-14 22:20:47 +00:00
keptn e32abf7b03 Updated resource 2023-11-14 22:17:16 +00:00
keptn 277d0a15d5 Updated resource 2023-11-14 20:10:10 +00:00
keptn cb9e4d56dd Updated resource 2023-11-14 19:29:03 +00:00
keptn b267f66694 Updated resource 2023-11-14 18:43:35 +00:00
keptn c75b9c6f51 Updated resource 2023-11-14 18:32:48 +00:00
keptn fd32abf397 Updated resource 2023-11-14 16:09:27 +00:00
keptn 5bf16fb32a Updated resource 2023-11-14 16:07:28 +00:00
keptn 1f9785d918 Added service: carts-db 2023-11-14 16:06:48 +00:00
keptn d0cb1dba85 Updated resource 2023-11-14 15:59:22 +00:00
keptn 7d1d0e0c1e Updated resource 2023-11-14 15:56:55 +00:00
keptn c788c0dafd Updated resource 2023-11-14 13:24:31 +00:00
keptn 52c4ddd546 Updated resource 2023-11-14 13:17:22 +00:00
keptn a70ea8e899 Updated resource 2023-11-14 13:08:02 +00:00
keptn ff8dadc6f5 Updated resource 2023-11-14 12:20:21 +00:00
keptn be06d311f2 Updated resource 2023-11-14 11:58:27 +00:00
keptn 7295149e87 Updated resource 2023-11-14 11:46:29 +00:00
keptn 378346e754 Updated resource 2023-11-14 10:45:49 +00:00
keptn beb9c738a2 Updated resource 2023-11-14 10:41:46 +00:00
keptn 5565aa8483 Updated resource 2023-11-14 10:33:38 +00:00
keptn 808823f422 Updated resource 2023-11-13 19:50:02 +00:00
keptn 841e000a5e Updated resource 2023-11-13 19:48:42 +00:00
keptn 3b510f20ad Updated resource 2023-11-13 18:32:42 +00:00
keptn 0fedf2701c Added service: carts 2023-11-13 18:27:48 +00:00
keptn c7df62fb8c created stage 2023-11-13 18:26:47 +00:00
49 changed files with 119 additions and 1527 deletions

34
.gitignore vendored
View File

@ -1,34 +0,0 @@
# Local .terraform directories
**/.terraform/*
# .tfstate files
*.tfstate
*.tfstate.*
*.tfplan
# Crash log files
crash.log
# Exclude all .tfvars files, which are likely to contain sentitive data, such as
# password, private keys, and other secrets. These should not be part of version
# control as they are data points which are potentially sensitive and subject
# to change depending on the environment.
*.tfvars
# Ignore override files as they are usually used to override resources locally and so
# are not checked in
override.tf
override.tf.json
*_override.tf
*_override.tf.json
# Ignore CLI configuration files
.terraformrc
terraform.rc
.env
*.env
venv
.helm

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,4 +0,0 @@
apiVersion: v1
description: A Helm chart for service carts-db
name: carts-db
version: 0.1.0

Binary file not shown.

58
carts-db/job/config.yaml Normal file
View File

@ -0,0 +1,58 @@
apiVersion: v2
actions:
- name: "Deploy using helm"
events:
- name: "sh.keptn.event.deployment.triggered"
tasks:
- name: "Run helm"
files:
- /charts
env:
- name: IMAGE
value: "$.data.configurationChange.values.image"
valueFrom: event
image: "alpine/helm:3.7.2"
serviceAccount: "jes-deploy-using-helm"
cmd: ["helm"]
args: ["upgrade", "--create-namespace", "--install", "-n", "$(KEPTN_PROJECT)-$(KEPTN_STAGE)", "$(KEPTN_SERVICE)", "/keptn/charts/$(KEPTN_SERVICE).tgz", "--set", "image=$(IMAGE)", "--set", "keptn.service=$(KEPTN_SERVICE)", "--set", "keptn.deployment=$(KEPTN_STAGE)", "--wait"]
- name: "Rollback using helm"
events:
- name: "sh.keptn.event.rollback.triggered"
tasks:
- name: "Run helm"
serviceAccount: "jes-deploy-using-helm"
image: "alpine/helm:3.7.2"
cmd: ["helm"]
args: ["rollback", "-n", "$(KEPTN_PROJECT)-$(KEPTN_STAGE)", "$(KEPTN_SERVICE)", "--wait"]
- name: "Scale using kubectl"
events:
- name: "sh.keptn.event.action.triggered"
jsonpath:
property: "$.data.action.action"
match: "scaling"
tasks:
- name: "Run kubectl"
serviceAccount: "jes-deploy-using-helm"
env:
- name: SCALING
value: $.data.action.value
valueFrom: event
image: "alpine/k8s:1.20.15"
cmd: ["sh"]
# Note: Hardcoded kubernetes namespace & KEPTN_SERVICE does most likely not match the deployment name
args: ["-c", "REPLICAS=$(kubectl -n ${KEPTN_PROJECT}-${KEPTN_STAGE} get deployment/${KEPTN_SERVICE} -o go-template='{{.spec.replicas}}');DESIRED=$((${SCALING}+${REPLICAS}));echo Scaling deployment to ${DESIRED} && kubectl -n ${KEPTN_PROJECT}-${KEPTN_STAGE} scale --replicas=${DESIRED} deployment/${KEPTN_SERVICE}"]
- name: "Run tests using locust"
events:
- name: "sh.keptn.event.test.triggered"
tasks:
- name: "Run locust"
files:
- locust/basic.py
- locust/locust.conf
image: "locustio/locust:2.8.6"
cmd: ["locust"]
args: ["--config", "/keptn/locust/locust.conf", "-f", "/keptn/locust/basic.py", "--host", "http://$(KEPTN_SERVICE).$(KEPTN_PROJECT)-$(KEPTN_STAGE)", "--only-summary"]

2
carts-db/metadata.yaml Normal file
View File

@ -0,0 +1,2 @@
servicename: carts-db
creationtimestamp: 2023-11-14 16:06:48.551336247 +0000 UTC

View File

@ -1,61 +0,0 @@
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: carts-db-mongodata
spec:
{% comment %} storageClassName: region1storageclass {% endcomment %}
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
status: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: carts-db
labels:
app: carts-db
spec:
replicas: {{ .Values.replicaCount }}
strategy:
type: Recreate
selector:
matchLabels:
app: carts-db
template:
metadata:
labels:
app: carts-db
deployment: carts-db
app.kubernetes.io/name: {{ .Values.keptn.service }}
app.kubernetes.io/instance: "{{ .Values.keptn.service }}-{{ .Values.keptn.deployment }}"
app.kubernetes.io/component: database
app.kubernetes.io/part-of: "{{ .Values.keptn.project }}"
app.kubernetes.io/managed-by: Keptn
app.kubernetes.io/version: {{ (split ":" .Values.image)._1 | default "latest" }}
spec:
containers:
- name: carts-db
image: {{ .Values.image }}
imagePullPolicy: IfNotPresent
ports:
- containerPort: 27017
resources: {}
volumeMounts:
- mountPath: /data/db
name: carts-db-mongodata
restartPolicy: Always
volumes:
- name: carts-db-mongodata
persistentVolumeClaim:
claimName: carts-db-mongodata
{% comment %} nodeSelector:
role: "group2" {% endcomment %}
{% comment %} tolerations:
- key: "dedicated"
operator: "Equal"
value: "group2"
effect: "NoSchedule" {% endcomment %}

View File

@ -1,12 +0,0 @@
---
apiVersion: v1
kind: Service
metadata:
name: carts-db
spec:
ports:
- name: {{ .Values.service.name }}
port: {{ .Values.service.externalPort }}
targetPort: {{ .Values.service.internalPort }}
selector:
app: carts-db

View File

@ -1,6 +0,0 @@
image: mongo
service:
externalPort: 27017
internalPort: 27017
name: carts-db
replicaCount: 1

Binary file not shown.

BIN
carts.tgz

Binary file not shown.

View File

@ -1,4 +0,0 @@
apiVersion: v1
description: A Helm chart for service carts
name: carts
version: 0.1.0

BIN
carts/carts.tgz Normal file

Binary file not shown.

Binary file not shown.

BIN
carts/charts/carts.tgz Normal file

Binary file not shown.

View File

@ -4,16 +4,6 @@ actions:
events: events:
- name: "sh.keptn.event.deployment.triggered" - name: "sh.keptn.event.deployment.triggered"
tasks: tasks:
# - name: "Create Namespace"
# serviceAccount: "jes-deploy-using-helm"
# # env:
# # - name: SCALING
# # value: $.data.action.value
# # valueFrom: event
# image: "alpine/k8s:1.20.15"
# cmd: ["sh"]
# # Note: Hardcoded kubernetes namespace & KEPTN_SERVICE does most likely not match the deployment name
# args: ["-c", "REPLICAS=$(kubectl -n ${KEPTN_PROJECT}-${KEPTN_STAGE} get deployment/${KEPTN_SERVICE} -o go-template='{{.spec.replicas}}');DESIRED=$((${SCALING}+${REPLICAS}));echo Scaling deployment to ${DESIRED} && kubectl -n ${KEPTN_PROJECT}-${KEPTN_STAGE} scale --replicas=${DESIRED} deployment/${KEPTN_SERVICE}"]
- name: "Run helm" - name: "Run helm"
files: files:
- /charts - /charts
@ -24,17 +14,8 @@ actions:
image: "alpine/helm:3.7.2" image: "alpine/helm:3.7.2"
serviceAccount: "jes-deploy-using-helm" serviceAccount: "jes-deploy-using-helm"
cmd: ["helm"] cmd: ["helm"]
#args: ["upgrade", "--force", "--create-namespace", "--install", "-n", "$(KEPTN_PROJECT)-$(KEPTN_STAGE)", "$(KEPTN_SERVICE)", "/keptn/charts/$(KEPTN_SERVICE).tgz", "--set", "image=$(IMAGE)", "--set", "keptn.service=$(KEPTN_SERVICE)", "--set", "keptn.deployment=$(KEPTN_STAGE)", "--set", "keptn.project=$(KEPTN_PROJECT)","--set", "keptn.stage=$(KEPTN_STAGE)", "--wait"] args: ["upgrade", "--force", "--create-namespace", "--install", "-n", "$(KEPTN_PROJECT)-$(KEPTN_STAGE)", "$(KEPTN_SERVICE)", "/keptn/charts/$(KEPTN_SERVICE).tgz", "--set", "image=$(IMAGE)", "--set", "keptn.service=$(KEPTN_SERVICE)", "--set", "keptn.deployment=$(KEPTN_STAGE)", "--set", "keptn.project=$(KEPTN_PROJECT)","--set", "keptn.stage=$(KEPTN_STAGE)", "--wait"]
args: ["upgrade", "--force", "--install", "-n", "$(KEPTN_PROJECT)-$(KEPTN_STAGE)", "$(KEPTN_SERVICE)", "/keptn/charts/$(KEPTN_SERVICE).tgz", "--set", "image=$(IMAGE)", "--set", "keptn.service=$(KEPTN_SERVICE)", "--set", "keptn.deployment=$(KEPTN_STAGE)", "--set", "keptn.project=$(KEPTN_PROJECT)","--set", "keptn.stage=$(KEPTN_STAGE)", "--wait"]
- name: "Uninstall"
events:
- name: "sh.keptn.event.uninstall.triggered"
tasks:
- name: "Run helm uninstall"
serviceAccount: "jes-deploy-using-helm"
image: "alpine/helm:3.7.2"
cmd: ["helm"]
args: ["uninstall", "-n", "$(KEPTN_PROJECT)-$(KEPTN_STAGE)", "$(KEPTN_SERVICE)", "--wait"]
- name: "Rollback using helm" - name: "Rollback using helm"
events: events:
- name: "sh.keptn.event.rollback.triggered" - name: "sh.keptn.event.rollback.triggered"

Binary file not shown.

2
carts/metadata.yaml Normal file
View File

@ -0,0 +1,2 @@
servicename: carts
creationtimestamp: 2023-11-13 18:27:48.297161439 +0000 UTC

View File

@ -1,85 +0,0 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: carts
spec:
replicas: {{ .Values.replicaCount }}
strategy:
rollingUpdate:
maxUnavailable: 0
type: RollingUpdate
selector:
matchLabels:
app: carts
template:
metadata:
labels:
app: carts
app.kubernetes.io/name: {{ .Values.keptn.service }}
app.kubernetes.io/instance: "{{ .Values.keptn.service }}-{{ .Values.keptn.deployment }}"
app.kubernetes.io/component: api
app.kubernetes.io/part-of: "{{ .Values.keptn.project }}"
app.kubernetes.io/managed-by: Keptn
app.kubernetes.io/version: {{ (split ":" .Values.image)._1 | default "latest" }}
spec:
containers:
- name: carts
image: "{{ .Values.image }}"
imagePullPolicy: IfNotPresent
ports:
- name: http
protocol: TCP
containerPort: 8080
env:
- name: DT_CUSTOM_PROP
value: "version={{ .Chart.Version }} revision={{ .Release.Revision }} releasename={{ .Release.Name }} keptn_project={{ .Values.keptn.project }} keptn_service={{ .Values.keptn.service }} keptn_stage={{ .Values.keptn.stage }} keptn_deployment={{ .Values.keptn.deployment }}"
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: "metadata.name"
- name: DEPLOYMENT_NAME
valueFrom:
fieldRef:
fieldPath: "metadata.labels['deployment']"
- name: CONTAINER_IMAGE
value: "{{ .Values.image }}"
- name: KEPTN_PROJECT
value: "{{ .Chart.Name }}"
- name: KEPTN_STAGE
valueFrom:
fieldRef:
fieldPath: "metadata.namespace"
- name: KEPTN_SERVICE
value: "carts"
- name: UNLEASH_SERVER_URL
value: "http://unleash.unleash-dev/api"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 15
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 15
resources:
limits:
cpu: 1000m
memory: 2048Mi
requests:
cpu: 500m
memory: 1024Mi
{% comment %} nodeSelector:
role: "group2"
tolerations:
- key: "dedicated"
operator: "Equal"
value: "group2"
effect: "NoSchedule" {% endcomment %}

View File

@ -1,23 +0,0 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: carts
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx
tls:
- hosts:
- "carts-{{ .Values.keptn.deployment }}.nttdata-xlabs.com"
secretName: letsencrypt-prod
rules:
- host: "carts-{{ .Values.keptn.deployment }}.nttdata-xlabs.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: carts
port:
number: 80

View File

@ -1,14 +0,0 @@
---
apiVersion: v1
kind: Service
metadata:
name: carts
spec:
type: ClusterIP
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
selector:
app: carts

View File

@ -1,2 +0,0 @@
image: docker.io/keptnexamples/carts:0.13.1
replicaCount: 1

View File

@ -1,2 +0,0 @@
spec_version: '0.1.0'
dtCreds: dynatrace-service

View File

@ -1,12 +0,0 @@
---
spec_version: '1.0'
indicators:
throughput: "metricSelector=builtin:service.requestCount.total:merge(\"dt.entity.service\"):sum&entitySelector=type(SERVICE),tag(keptn_project:$PROJECT),tag(keptn_stage:$STAGE),tag(keptn_service:$SERVICE)"
error_rate: "metricSelector=builtin:service.errors.total.count:merge(\"dt.entity.service\"):avg&entitySelector=type(SERVICE),tag(keptn_project:$PROJECT),tag(keptn_stage:$STAGE),tag(keptn_service:$SERVICE)"
response_time_p50: "metricSelector=builtin:service.response.time:merge(\"dt.entity.service\"):percentile(50)&entitySelector=type(SERVICE),tag(keptn_project:$PROJECT),tag(keptn_stage:$STAGE),tag(keptn_service:$SERVICE)"
response_time_p90: "metricSelector=builtin:service.response.time:merge(\"dt.entity.service\"):percentile(90)&entitySelector=type(SERVICE),tag(keptn_project:$PROJECT),tag(keptn_stage:$STAGE),tag(keptn_service:$SERVICE)"
response_time_p95: "metricSelector=builtin:service.response.time:merge(\"dt.entity.service\"):percentile(95)&entitySelector=type(SERVICE),tag(keptn_project:$PROJECT),tag(keptn_stage:$STAGE),tag(keptn_service:$SERVICE)"
#rt_addToCart: "metricSelector=calc:service.itemscontroller.qg:filter(eq(url,addToCart)):merge(0):percentile(95)&entitySelector=tag(keptn_project:$PROJECT),tag(keptn_stage:$STAGE),tag(keptn_service:$SERVICE),type(SERVICE)"
pg_heap_suspension: "metricSelector=builtin:tech.jvm.memory.gc.suspensionTime:merge(\"dt.entity.process_group_instance\"):max&entitySelector=tag(keptn_project:$PROJECT),tag(keptn_stage:$STAGE),tag(keptn_service:$SERVICE),type(PROCESS_GROUP_INSTANCE)"
pg_cpu_usage: "metricSelector=builtin:tech.generic.cpu.usage:merge(\"dt.entity.process_group_instance\"):max&entitySelector=tag(keptn_project:$PROJECT),tag(keptn_stage:$STAGE),tag(keptn_service:$SERVICE),type(PROCESS_GROUP_INSTANCE)"
response_time_avg: "metricSelector=builtin:service.response.time:merge(\"dt.entity.service\"):avg&entitySelector=type(SERVICE),tag(keptn_project:$PROJECT),tag(keptn_stage:$STAGE),tag(keptn_service:$SERVICE)"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

View File

@ -1,139 +0,0 @@
pipeline {
agent {
label 'terraform-slave'
}
parameters {
choice(name: 'mode', choices: ['apply', 'destroy'], description: '')
choice(name: 'destroy_keptn', choices: ['no', 'yes'], description: '')
}
stages {
// stage('Refresh properties') {
// steps {
// script {
// if (Refresh) {
// currentBuild.result = 'ABORTED'
// error('Stopping early…')
// }
// }
// }
// }
stage('deploy Keptn') {
steps {
container('terraform') {
script {
def b = build job: 'shared/keptn deployment' , wait: true, parameters: [string(name: 'mode', value: "apply")]
//build job: 'ANOTHER_JOB_NAME', wait: false, parameters: [string(name: 'HELLO', value: String.valueOf(PARAMETER01))]
env.keptn_api_token = b.getBuildVariables()["KEPTN_API_TOKEN"]
env.TF_VAR_KEPTN_API_TOKEN = b.getBuildVariables()["KEPTN_API_TOKEN"]
env.keptn_bridge_url = b.getBuildVariables()["KEPTN_BRIDGE_URL"]
env.TF_VAR_KEPTN_BRIDGE_URL = b.getBuildVariables()["KEPTN_BRIDGE_URL"]
}
}
}
}
stage('Download & Install Keptn CLI') {
steps {
container('terraform') {
sh "apk add --no-cache curl"
sh "apk add --no-cache bash"
sh "apk add --no-cache gawk"
sh 'wget https://github.com/keptn/keptn/releases/download/1.4.0/keptn-1.4.0-linux-amd64.tar.gz'
sh 'tar -xvf keptn-1.4.0-linux-amd64.tar.gz'
sh 'mv keptn-1.4.0-linux-amd64 /usr/local/bin/keptn'
// sh 'curl -sL https://get.keptn.sh/ | bash'
sh 'keptn set config AutomaticVersionCheck false'
sh 'keptn set config KubeContextCheck false'
sh 'keptn version'
sh "keptn auth --endpoint=${keptn_bridge_url}/api --api-token=${keptn_api_token}"
}
}
}
// stage('terraform init') {
// steps {
// container('terraform') {
// dir("terraform") {
// withCredentials([[
// $class: 'AmazonWebServicesCredentialsBinding',
// credentialsId: "f89b3f7d-23ec-42b9-9687-e4acf01d7507",
// accessKeyVariable: 'AWS_ACCESS_KEY_ID',
// secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) {
// sh 'terraform init -backend-config="key=keptn-sockshop-demo"'
// }
// }
// }
// }
// }
stage('Create Keptn Project') {
when {
expression {
return params.mode == 'apply'
}
}
steps {
container('terraform') {
dir("terraform") {
withCredentials([[
$class: 'AmazonWebServicesCredentialsBinding',
credentialsId: "f89b3f7d-23ec-42b9-9687-e4acf01d7507",
accessKeyVariable: 'AWS_ACCESS_KEY_ID',
secretKeyVariable: 'AWS_SECRET_ACCESS_KEY'],
string(credentialsId: 'gitea_demo_api_token', variable: 'TF_VAR_GITEA_TOKEN')]) {
sh 'terraform init -backend-config="key=keptn-sockshop-demo"'
sh 'terraform apply --target kubernetes_namespace.carts-dev -auto-approve'
sh 'terraform apply --target kubernetes_namespace.carts-staging -auto-approve'
sh 'terraform apply --target kubernetes_namespace.carts-production -auto-approve'
sh 'terraform apply -auto-approve'
}
}
}
}
}
stage('Destroy Keptn Project') {
when {
expression {
return params.mode == 'destroy'
}
}
steps {
container('terraform') {
sh "keptn auth --endpoint=${keptn_bridge_url}/api --api-token=${keptn_api_token}"
dir("terraform") {
withCredentials([[
$class: 'AmazonWebServicesCredentialsBinding',
credentialsId: "f89b3f7d-23ec-42b9-9687-e4acf01d7507",
accessKeyVariable: 'AWS_ACCESS_KEY_ID',
secretKeyVariable: 'AWS_SECRET_ACCESS_KEY'],
string(credentialsId: 'gitea_demo_api_token', variable: 'TF_VAR_GITEA_TOKEN')]) {
sh 'terraform init -backend-config="key=keptn-sockshop-demo"'
sh 'terraform destroy --target null_resource.seed-unix-destroy -auto-approve'
sh 'terraform destroy --target gitea_repository.demo-repo -auto-approve'
}
}
//build job: 'shared/keptn deployment' , wait: true, parameters: [string(name: 'mode', value: "destroy")]
}
}
}
stage('Destroy Keptn ') {
when {
expression {
return params.mode == 'destroy' && params.destroy_keptn == 'yes'
}
}
steps {
container('terraform') {
//build job: 'shared/keptn deployment' , wait: true, parameters: [string(name: 'mode', value: "destroy")]
}
}
}
}
}

View File

@ -1,177 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.1.1 r1855137">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Testing Sample NodeJs" enabled="true">
<stringProp name="TestPlan.comments"></stringProp>
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="SERVER_URL" elementType="Argument">
<stringProp name="Argument.name">SERVER_URL</stringProp>
<stringProp name="Argument.value">carts-dev.nttdata-xlabs.com</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="CHECK_PATH" elementType="Argument">
<stringProp name="Argument.name">CHECK_PATH</stringProp>
<stringProp name="Argument.value">/</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="DT_LTN" elementType="Argument">
<stringProp name="Argument.name">DT_LTN</stringProp>
<stringProp name="Argument.value">Default</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="DefaultThinkTime" elementType="Argument">
<stringProp name="Argument.name">DefaultThinkTime</stringProp>
<stringProp name="Argument.value">250</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="SERVER_PORT" elementType="Argument">
<stringProp name="Argument.name">SERVER_PORT</stringProp>
<stringProp name="Argument.value">443</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="PROTOCOL" elementType="Argument">
<stringProp name="Argument.name">PROTOCOL</stringProp>
<stringProp name="Argument.value">https</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="VUCount" elementType="Argument">
<stringProp name="Argument.name">VUCount</stringProp>
<stringProp name="Argument.value">1</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="LoopCount" elementType="Argument">
<stringProp name="Argument.name">LoopCount</stringProp>
<stringProp name="Argument.value">1</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="TestPlan.user_define_classpath"></stringProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="BasicThreadGroup" enabled="true">
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
<boolProp name="LoopController.continue_forever">false</boolProp>
<stringProp name="LoopController.loops">${__P(LoopCount,${VUCount})}</stringProp>
</elementProp>
<stringProp name="ThreadGroup.num_threads">${__P(VUCount,${VUCount})}</stringProp>
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
<longProp name="ThreadGroup.start_time">1444323045000</longProp>
<longProp name="ThreadGroup.end_time">1444323045000</longProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
</ThreadGroup>
<hashTree>
<CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true">
<collectionProp name="CookieManager.cookies"/>
<boolProp name="CookieManager.clearEachIteration">false</boolProp>
</CookieManager>
<hashTree/>
<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true">
<collectionProp name="HeaderManager.headers"/>
</HeaderManager>
<hashTree/>
<BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="Set Dynatrace Headers" enabled="true">
<boolProp name="resetInterpreter">true</boolProp>
<stringProp name="parameters"></stringProp>
<stringProp name="filename"></stringProp>
<stringProp name="script">import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.protocol.http.control.HeaderManager;
import java.io;
import java.util;
// -------------------------------------------------------------------------------------
// Generate the x-dynatrace-test header based on this best practic
// -&gt; https://www.dynatrace.com/support/help/integrations/test-automation-frameworks/how-do-i-integrate-dynatrace-into-my-load-testing-process/
// -------------------------------------------------------------------------------------
String LTN=JMeterUtils.getProperty(&quot;DT_LTN&quot;);
if((LTN == null) || (LTN.length() == 0)) {
if(vars != null) {
LTN = vars.get(&quot;DT_LTN&quot;);
}
}
if(LTN == null) LTN = &quot;NoTestName&quot;;
String LSN = (bsh.args.length &gt; 0) ? bsh.args[0] : &quot;Test Scenario&quot;;
String TSN = sampler.getName();
String VU = ctx.getThreadGroup().getName() + ctx.getThreadNum();
String headerValue = &quot;LSN=&quot;+ LSN + &quot;;TSN=&quot; + TSN + &quot;;LTN=&quot; + LTN + &quot;;VU=&quot; + VU + &quot;;&quot;;
// -------------------------------------------
// Set header
// -------------------------------------------
HeaderManager hm = sampler.getHeaderManager();
hm.removeHeaderNamed(&quot;x-dynatrace-test&quot;);
hm.add(new org.apache.jmeter.protocol.http.control.Header(&quot;x-dynatrace-test&quot;, headerValue));</stringProp>
</BeanShellPreProcessor>
<hashTree/>
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Basic Check" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain">${__P(SERVER_URL,${SERVER_URL})}</stringProp>
<stringProp name="HTTPSampler.port">${__P(SERVER_PORT,${SERVER_PORT})}</stringProp>
<stringProp name="HTTPSampler.protocol">${__P(PROTOCOL,${PROTOCOL})}</stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${__P(CHECK_PATH,${CHECK_PATH})}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
</HTTPSamplerProxy>
<hashTree>
<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true">
<collectionProp name="HeaderManager.headers"/>
</HeaderManager>
<hashTree/>
</hashTree>
<ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Default Think Time" enabled="true">
<stringProp name="ConstantTimer.delay">{__P(ThinkTime,${DefaultThinkTime})}</stringProp>
</ConstantTimer>
<hashTree/>
</hashTree>
<ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report" enabled="true">
<boolProp name="ResultCollector.error_logging">false</boolProp>
<objProp>
<name>saveConfig</name>
<value class="SampleSaveConfiguration">
<time>true</time>
<latency>true</latency>
<timestamp>true</timestamp>
<success>true</success>
<label>true</label>
<code>true</code>
<message>true</message>
<threadName>true</threadName>
<dataType>true</dataType>
<encoding>false</encoding>
<assertions>true</assertions>
<subresults>true</subresults>
<responseData>false</responseData>
<samplerData>false</samplerData>
<xml>false</xml>
<fieldNames>false</fieldNames>
<responseHeaders>false</responseHeaders>
<requestHeaders>false</requestHeaders>
<responseDataOnError>false</responseDataOnError>
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
<assertionsResultsToSave>0</assertionsResultsToSave>
<bytes>true</bytes>
<threadCounts>true</threadCounts>
</value>
</objProp>
<stringProp name="filename"></stringProp>
</ResultCollector>
<hashTree/>
</hashTree>
</hashTree>
</jmeterTestPlan>

View File

@ -1,193 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.2.1">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
<stringProp name="TestPlan.comments"></stringProp>
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="SERVER_URL" elementType="Argument">
<stringProp name="Argument.name">SERVER_URL</stringProp>
<stringProp name="Argument.value">carts-staging.nttdata-xlabs.com</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="DefaultThinkTime" elementType="Argument">
<stringProp name="Argument.name">DefaultThinkTime</stringProp>
<stringProp name="Argument.value">250</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="DT_LTN" elementType="Argument">
<stringProp name="Argument.name">DT_LTN</stringProp>
<stringProp name="Argument.value">Default</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="SERVER_PORT" elementType="Argument">
<stringProp name="Argument.name">SERVER_PORT</stringProp>
<stringProp name="Argument.value">443</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="PROTOCOL" elementType="Argument">
<stringProp name="Argument.name">PROTOCOL</stringProp>
<stringProp name="Argument.value">https</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="VUCount" elementType="Argument">
<stringProp name="Argument.name">VUCount</stringProp>
<stringProp name="Argument.value">1</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="LoopCount" elementType="Argument">
<stringProp name="Argument.name">LoopCount</stringProp>
<stringProp name="Argument.value">1000</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="TestPlan.user_define_classpath"></stringProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
<boolProp name="LoopController.continue_forever">false</boolProp>
<stringProp name="LoopController.loops">${__P(LoopCount,${LoopCount})}</stringProp>
</elementProp>
<stringProp name="ThreadGroup.num_threads">${__P(VUCount,${VUCount})}</stringProp>
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
<longProp name="ThreadGroup.start_time">1536064517000</longProp>
<longProp name="ThreadGroup.end_time">1536064517000</longProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
</ThreadGroup>
<hashTree>
<CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true">
<collectionProp name="CookieManager.cookies"/>
<boolProp name="CookieManager.clearEachIteration">false</boolProp>
<boolProp name="CookieManager.controlledByThreadGroup">false</boolProp>
</CookieManager>
<hashTree/>
<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true">
<collectionProp name="HeaderManager.headers">
<elementProp name="" elementType="Header">
<stringProp name="Header.name">Cache-Control</stringProp>
<stringProp name="Header.value">no-cache</stringProp>
</elementProp>
<elementProp name="" elementType="Header">
<stringProp name="Header.name">Content-Type</stringProp>
<stringProp name="Header.value">application/json</stringProp>
</elementProp>
<elementProp name="" elementType="Header">
<stringProp name="Header.name">json</stringProp>
<stringProp name="Header.value">true</stringProp>
</elementProp>
</collectionProp>
</HeaderManager>
<hashTree/>
<BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="Set Dynatrace Headers" enabled="true">
<stringProp name="filename"></stringProp>
<stringProp name="parameters"></stringProp>
<boolProp name="resetInterpreter">false</boolProp>
<stringProp name="script">import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.protocol.http.control.HeaderManager;
import java.io;
import java.util;
// -------------------------------------------------------------------------------------
// Generate the x-dynatrace-test header based on this best practic
// -&gt; https://www.dynatrace.com/support/help/integrations/test-automation-frameworks/how-do-i-integrate-dynatrace-into-my-load-testing-process/
// -------------------------------------------------------------------------------------
String LTN=JMeterUtils.getProperty(&quot;DT_LTN&quot;);
if((LTN == null) || (LTN.length() == 0)) {
if(vars != null) {
LTN = vars.get(&quot;DT_LTN&quot;);
}
}
if(LTN == null) LTN = &quot;NoTestName&quot;;
String LSN = (bsh.args.length &gt; 0) ? bsh.args[0] : &quot;Test Scenario&quot;;
String TSN = sampler.getName();
String VU = ctx.getThreadGroup().getName() + ctx.getThreadNum();
String headerValue = &quot;LSN=&quot;+ LSN + &quot;;TSN=&quot; + TSN + &quot;;LTN=&quot; + LTN + &quot;;VU=&quot; + VU + &quot;;&quot;;
// -------------------------------------------
// Set header
// -------------------------------------------
HeaderManager hm = sampler.getHeaderManager();
hm.removeHeaderNamed(&quot;x-dynatrace-test&quot;);
hm.add(new org.apache.jmeter.protocol.http.control.Header(&quot;x-dynatrace-test&quot;, headerValue));</stringProp>
</BeanShellPreProcessor>
<hashTree/>
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Add Item to Cart" enabled="true">
<boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
<elementProp name="HTTPsampler.Arguments" elementType="Arguments">
<collectionProp name="Arguments.arguments">
<elementProp name="" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value"> {&#xd;
&quot;itemId&quot;:&quot;03fef6ac-1896-4ce8-bd69-b798f85c6e0b&quot;,&#xd;
&quot;unitPrice&quot;:&quot;99.99&quot;&#xd;
}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain">${__P(SERVER_URL,${SERVER_URL})}</stringProp>
<stringProp name="HTTPSampler.port">${__P(SERVER_PORT,${SERVER_PORT})}</stringProp>
<stringProp name="HTTPSampler.protocol">${__P(PROTOCOL,${PROTOCOL})}</stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">/carts/1/items</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.BROWSER_COMPATIBLE_MULTIPART">true</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
</HTTPSamplerProxy>
<hashTree/>
<ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Default Think Time" enabled="true">
<stringProp name="ConstantTimer.delay">{__P(ThinkTime,${DefaultThinkTime})}</stringProp>
</ConstantTimer>
<hashTree/>
</hashTree>
<ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
<boolProp name="ResultCollector.error_logging">false</boolProp>
<objProp>
<name>saveConfig</name>
<value class="SampleSaveConfiguration">
<time>true</time>
<latency>true</latency>
<timestamp>true</timestamp>
<success>true</success>
<label>true</label>
<code>true</code>
<message>true</message>
<threadName>true</threadName>
<dataType>true</dataType>
<encoding>false</encoding>
<assertions>true</assertions>
<subresults>true</subresults>
<responseData>false</responseData>
<samplerData>false</samplerData>
<xml>false</xml>
<fieldNames>false</fieldNames>
<responseHeaders>false</responseHeaders>
<requestHeaders>false</requestHeaders>
<responseDataOnError>false</responseDataOnError>
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
<assertionsResultsToSave>0</assertionsResultsToSave>
<bytes>true</bytes>
<threadCounts>true</threadCounts>
</value>
</objProp>
<stringProp name="filename"></stringProp>
</ResultCollector>
<hashTree/>
</hashTree>
</hashTree>
</jmeterTestPlan>

View File

@ -1,66 +0,0 @@
apiVersion: v2
actions:
- name: "Deploy using helm"
events:
- name: "sh.keptn.event.deployment.triggered"
tasks:
- name: "Run helm"
files:
- /charts
env:
- name: IMAGE
value: "$.data.configurationChange.values.image"
valueFrom: event
image: "alpine/helm:3.7.2"
serviceAccount: "jes-deploy-using-helm"
cmd: ["helm"]
args: ["upgrade", "--force", "--create-namespace", "--install", "-n", "$(KEPTN_PROJECT)-$(KEPTN_STAGE)", "$(KEPTN_SERVICE)", "/keptn/charts/$(KEPTN_SERVICE).tgz", "--set", "image=$(IMAGE)", "--set", "keptn.service=$(KEPTN_SERVICE)", "--set", "keptn.deployment=$(KEPTN_STAGE)", "--set", "keptn.project=$(KEPTN_PROJECT)","--set", "keptn.stage=$(KEPTN_STAGE)", "--wait"]
- name: "Uninstall"
events:
- name: "sh.keptn.event.uninstall.triggered"
tasks:
- name: "Run helm uninstall"
serviceAccount: "jes-deploy-using-helm"
image: "alpine/helm:3.7.2"
cmd: ["helm"]
args: ["uninstall", "-n", "$(KEPTN_PROJECT)-$(KEPTN_STAGE)", "$(KEPTN_SERVICE)", "--wait"]
# - name: "Rollback using helm"
# events:
# - name: "sh.keptn.event.rollback.triggered"
# tasks:
# - name: "Run helm"
# serviceAccount: "jes-deploy-using-helm"
# image: "alpine/helm:3.7.2"
# cmd: ["helm"]
# args: ["rollback", "-n", "$(KEPTN_PROJECT)-$(KEPTN_STAGE)", "$(KEPTN_SERVICE)", "--wait"]
# - name: "Scale using kubectl"
# events:
# - name: "sh.keptn.event.action.triggered"
# jsonpath:
# property: "$.data.action.action"
# match: "scaling"
# tasks:
# - name: "Run kubectl"
# serviceAccount: "jes-deploy-using-helm"
# env:
# - name: SCALING
# value: $.data.action.value
# valueFrom: event
# image: "alpine/k8s:1.20.15"
# cmd: ["sh"]
# # Note: Hardcoded kubernetes namespace & KEPTN_SERVICE does most likely not match the deployment name
# args: ["-c", "REPLICAS=$(kubectl -n ${KEPTN_PROJECT}-${KEPTN_STAGE} get deployment/${KEPTN_SERVICE} -o go-template='{{.spec.replicas}}');DESIRED=$((${SCALING}+${REPLICAS}));echo Scaling deployment to ${DESIRED} && kubectl -n ${KEPTN_PROJECT}-${KEPTN_STAGE} scale --replicas=${DESIRED} deployment/${KEPTN_SERVICE}"]
# - name: "Run tests using locust"
# events:
# - name: "sh.keptn.event.test.triggered"
# tasks:
# - name: "Run locust"
# files:
# - locust/basic.py
# - locust/locust.conf
# image: "locustio/locust:2.8.6"
# cmd: ["locust"]
# args: ["--config", "/keptn/locust/locust.conf", "-f", "/keptn/locust/basic.py", "--host", "http://$(KEPTN_SERVICE)-$(KEPTN_STAGE).nttdata-xlabs.com", "--only-summary"]

View File

@ -1,8 +0,0 @@
from locust import HttpUser, between, task
class WebsiteUser(HttpUser):
#wait_time = between(5, 15)
@task
def index(self):
self.client.post("/carts/1/items", json= {"itemId":"03fef6ac-1896-4ce8-bd69-b798f85c6e0b","unitPrice":"99.99"}, headers={"x-dynatrace-test": "LSN=Test;"})

View File

@ -1,4 +0,0 @@
locustfile = /locust/locust.py
headless = true
users = 5
run-time = 1m

View File

@ -1,8 +0,0 @@
from locust import HttpUser, between, task
class WebsiteUser(HttpUser):
#wait_time = between(5, 15)
@task
def index(self):
self.client.post("/carts/1/items", json= {"itemId":"03fef6ac-1896-4ce8-bd69-b798f85c6e0b","unitPrice":"99.99"}, headers={"x-dynatrace-test": "LSN=Test;"})

View File

@ -1,5 +0,0 @@
locustfile = /locust/locust.py
headless = true
users = 5
run-time = 1m
exit-code-on-error=0

27
readme
View File

@ -1,27 +0,0 @@
dynatrace-service must be deployed (credentials must be created)
jobexecuter service must be deployed
project erzeugen mit cli
dynatrace config mit cli durchführen
keptn add-resource --project=sockshop --service=carts --all-stages --resource=carts.tgz --resourceUri=charts/carts.tgz
keptn add-resource --project=sockshop --service=carts --all-stages --resource=./job-executer/job.yaml --resourceUri=job/config.yaml
keptn add-resource --project=sockshop --service=carts --stage=staging --resource=./locust/basic.py
keptn add-resource --project=sockshop --service=carts --stage=staging --resource=./locust/locust.conf
keptn add-resource --project=sockshop --stage=staging --service=carts --resource=slo.yaml --resourceUri=slo.yaml
keptn add-resource --project=sockshop --resource=dynatrace/sli.yaml --resourceUri=dynatrace/sli.yaml
keptn trigger delivery --project=sockshop --service=carts --image="docker.io/keptnexamples/carts:0.13.1" --labels=image="keptnexamples/carts:0.13.1",version="0.13.1"
keptn trigger delivery --project=sockshop --service=carts-db --image="mongo:4.2.2" --labels=image="keptnexamples/carts-db:4.2.2",version="4.2.2"
keptn trigger delivery --project=sockshop --service=carts --image="docker.io/keptnexamples/carts:0.13.1" --labels=image="keptnexamples/carts:0.13.1",version="0.13.1" --stage=staging
keptn trigger delivery --project=sockshop --service=carts --image="docker.io/keptnexamples/carts:0.13.2" --labels=image="keptnexamples/carts:0.13.2",version="0.13.2" --stage=staging
keptn trigger delivery --project=carts --service=carts-db --image="mongo:4.2.2" --labels=image="keptnexamples/carts-db:4.2.2",version="4.2.2" --sequence=delivery-direct

View File

@ -1,114 +0,0 @@
apiVersion: "spec.keptn.sh/0.2.0"
kind: "Shipyard"
metadata:
name: "shipyard-sockshop"
spec:
stages:
- name: "dev"
sequences:
- name: "delivery"
tasks:
- name: "deployment"
properties:
deploymentstrategy: "direct"
# - name: "test"
# properties:
# teststrategy: "functional"
# - name: "evaluation"
- name: "delivery-direct"
tasks:
- name: "deployment"
properties:
deploymentstrategy: "direct"
#- name: "release"
# - name: "rollback"
# tasks:
# - name: "rollback"
# - name: "only-test"
# tasks:
# - name: "test"
# properties:
# teststrategy: "functional"
- name: "remove"
tasks:
- name: "uninstall"
- name: "staging"
sequences:
- name: "delivery"
triggeredOn:
- event: "dev.delivery.finished"
tasks:
- name: "deployment"
properties:
deploymentstrategy: "blue_green_service"
- name: "test"
properties:
teststrategy: "performance"
# - name: "evaluation"
#- name: "release"
- name: "rollback"
triggeredOn:
- event: "staging.delivery.finished"
selector:
match:
result: "fail"
tasks:
- name: "rollback"
- name: "delivery-direct"
triggeredOn:
- event: "dev.delivery-direct.finished"
tasks:
- name: "deployment"
properties:
deploymentstrategy: "direct"
#- name: "release"
- name: "remove"
triggeredOn:
- event: "dev.remove.finished"
tasks:
- name: "uninstall"
- name: "production"
sequences:
- name: "delivery"
triggeredOn:
- event: "staging.delivery.finished"
tasks:
- name: "deployment"
properties:
deploymentstrategy: "blue_green_service"
#- name: "release"
- name: "rollback"
triggeredOn:
- event: "production.delivery.finished"
selector:
match:
result: "fail"
tasks:
- name: "rollback"
- name: "delivery-direct"
triggeredOn:
- event: "staging.delivery-direct.finished"
tasks:
- name: "deployment"
properties:
deploymentstrategy: "direct"
#- name: "release"
- name: "remove"
triggeredOn:
- event: "staging.remove.finished"
tasks:
- name: "uninstall"
- name: "remediation"
triggeredOn:
- event: "production.remediation.finished"
selector:
match:
evaluation.result: "fail"
tasks:
- name: "get-action"
- name: "action"
- name: "evaluation"
triggeredAfter: "15m"
properties:
timeframe: "15m"

View File

@ -1,42 +0,0 @@
---
spec_version: "0.1.1"
comparison:
aggregate_function: "avg"
compare_with: "single_result"
include_result_with_score: "pass"
number_of_comparison_results: 1
filter:
objectives:
- sli: "response_time_p95"
key_sli: false
pass: # pass if (relative change <= 10% AND absolute value is < 600ms)
- criteria:
- "<=+25%" # relative values require a prefixed sign (plus or minus)
- "<600000" # absolute values only require a logical operator
warning: # if the response time is below 800ms, the result should be a warning
- criteria:
- "<=800000"
weight: 1
# - sli: "rt_addToCart" # looking at a particular transaction
# weight: 3 # business critical transaction
# pass:
# - criteria:
# - "<=+20%" # Degradation-driven
# - "<300000" # NFR-driven
# warning:
# - criteria:
# - "<=+50%"
# - "<=500000"
- sli: "error_rate"
pass:
- criteria:
- "<=+50%"
- "<5"
warning:
- criteria:
- "<10"
- sli: "pg_heap_suspension"
- sli: "pg_cpu_usage"
total_score:
pass: "90%"
warning: "70%"

View File

@ -1,15 +0,0 @@
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: region1storageclass
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
fsType: ext4 # Set to "true" if encryption is required
zone: us-west-2b
volumeBindingMode: WaitForFirstConsumer
# allowedTopologies:
# - matchLabelExpressions:
# - key: failure-domain.beta.kubernetes.io/zone
# values:
# - us-west-2c

View File

@ -1,61 +0,0 @@
# This file is maintained automatically by "terraform init".
# Manual edits may be lost in future updates.
provider "registry.terraform.io/lerentis/gitea" {
version = "0.16.0"
constraints = "0.16.0"
hashes = [
"h1:AAczXkCnaTGYRoMRp+A9y/S4YXbsmTWgRiEJj16Rik8=",
"zh:195b3288b1f8d9fffc3083a42d4e1a7c5b73399c47049a9d00674e4cd6e4d17e",
"zh:1c7f1213d45df525aae9963567fc77ed099c68ad7418b98cf317c4f8b3b2113c",
"zh:309ed896eec2854c61cbab131e8445da2ff599309ba804b8850a4b29a32a47e8",
"zh:34ec1a7f985f2a78dae58e040941b37d19827fc98941d6071c10f64c64c19de0",
"zh:45092d54ed8cdc53984e8638eb0db4512ab2be6f259c9ee5f6597607fae1440b",
"zh:4a82f10f958c112a5fc58e023f26d610a42dfb0bdddd849b6c06ef601d2e1e5f",
"zh:4ff3d423c1758d627e9c6a1c10209472670938c87ae8a0b9f0c3389dad75f944",
"zh:544e9ff610fadcfde7467871e519d88b5729fbf9d262751ba9f91e357e6ffa8b",
"zh:5cb4a4f6c6475c50e0bbc222501f0239e9a883036a34e4627783c6a5aa1fe7e0",
"zh:5d1e97243727b6e6ec6ca16069d9375cf02a4f266a293b1160220ee10ad84878",
"zh:615c36b8b0411068f8879c727639ea16666aa8767d0aee9014b408d17ef6d64d",
"zh:640d95dd0aae76a2a11bd5a083908d0349c28707f7643e09c0be75d5583f7068",
"zh:717d7c93f0b98d4447824a3b3a1da96250b1e1b85b4aec062c36243d07a6401d",
"zh:7398a21b8bbb30896a43b738de6a5c71067a58e7b932b497c70553bc46eb92bf",
"zh:76858d67e783a6a8c6dc143ee7ed6a3a501806fe93700fb0541b6223d4b51907",
"zh:77a978ecbe9c57c0a2548d159953e4c7faa7d5a365a76493c8d82199233eb58c",
"zh:791531ef14467b96cc65aef44ad0f93e0cfeefbd82b6e7229ff70fb0a3eda04d",
"zh:946e42bc059bc887674a2ffc42c21fe00fbab078321d378b1c437cc3dd9460e9",
"zh:988aeffc00f2baeace26c7d57dc73f73464bb228ceeb3eb0bb9b526b864be6bd",
"zh:c71c8c628f2344be5433116ef9ff76a2402cc388acd4e23c7d434a8251925f63",
"zh:db975a80d2fa0b389e9ea5852c6804e3ef6ee17332e8bd5c233d03d8456dfcc4",
"zh:ea04c117c126fc755c86e2616c2c055801002e14c34842b7b3ba607d95c7d1e0",
"zh:ec9a0669f4ed744823dc1721b9cd53460936e8f772e1aa726e9380686320b9dc",
"zh:ef7339a987c362fd855f5796c8dc1ada55dafb083b2a10538a4de11c0fe12569",
"zh:f0ec89e0c4f2f4b5b6c9880186a306d191801195a28593bc6e223da8b8dd76e7",
"zh:f1382abc5fa8140d4af81b5634581bedd108b5862ce74e994ff9ed5a6fecf8d3",
"zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
"zh:f772a40fb23b2fa885d73ff62ef0a2e1742f536d3d889054bb7b20e5e9d17309",
"zh:fffdfbc809ace7bd2a7618b674893ac0f87c51aa27167b6223c884313450ea53",
]
}
provider "registry.terraform.io/magodo/restful" {
version = "0.17.0"
hashes = [
"h1:u+Zq+FUlHpmsxNbeYnRIwGt8coU7B5iemzxmZCP9G00=",
"zh:137965c194987d45f3a6bb1b3b81952f0e614e32014644dee74949ffefee1651",
"zh:1da3d0ca1cdd39fbc2808286a68a307a70bbaaa95ba080c29eef1b21c0cd1648",
"zh:1e5c704ba584d756031e4d35be41bd445b942ab72d3737a3594abe6a89ce09ef",
"zh:35527164ca7080dba08bc42c943e148a442f5d7b598293cd0830c75c953d3ea8",
"zh:3ecce6264d45b4919ecef7ca118109917ac40e9b7226ea3867d11832084fe3ca",
"zh:437013a757e4a6ca30f68e23baadcc7fb4e4cd5150eebb506a4521c6f12cc8b2",
"zh:49d5e4f69a7f4f86e80ee633ee5c9a81432a33b42cc8b09f09dd217cbe5b23c3",
"zh:5018db0d71ca4e9e00839b2e40f042da310fd5586c737ee2051b16cf66ecb261",
"zh:68f1683e17cfab300566816de34c6f3c46db1519e4bf1e3f6d4b27ad28b60c93",
"zh:72570943de264ec0e533b5dddd282ecd23c8fab13748239b7068dc98c0de3699",
"zh:86061d47fe64c257b5c562758c632d8fd7774b06ff8b837c4ccb963f5b569136",
"zh:bff242d978a9f4591d130e1744eb6bf8d819df8ce6a0af95ce0129d998f22607",
"zh:c575cf5af509211289280656c424b40c0c8fca8b981495cd43abe4811d033dcd",
"zh:c5f89aee0419d2565ce8b167e8ee5efff3bacce8c76a20da97304d85a4cc20a3",
"zh:f809ab383cca0a5f83072981c64208cbd7fa67e986a86ee02dd2c82333221e32",
]
}

View File

@ -1,5 +0,0 @@
@echo off
keptn trigger delivery --project=carts --service=carts-db --image="" --sequence=remove
keptn trigger delivery --project=carts --service=carts --image="" --sequence=remove
keptn delete project carts

View File

@ -1,17 +0,0 @@
#!/bin/bash
keptn trigger delivery --project=carts --service=carts-db --image="" --sequence=remove
exit_code=$?
if [ $exit_code -ne 0 ]; then
echo "An error occurred."
fi
keptn trigger delivery --project=carts --service=carts --image="" --sequence=remove
exit_code=$?
if [ $exit_code -ne 0 ]; then
echo "An error occurred."
fi
sleep 90
keptn delete project carts

View File

@ -1,5 +0,0 @@
@echo off
set GIT_REPO=%1
set GIT_USER=%2
set GIT_TOKEN=%3
keptn create project carts --shipyard ..\shipyard.yaml --git-remote-url %GIT_REPO% --git-user %GIT_USER% --git-token %GIT_TOKEN%

View File

@ -1,25 +0,0 @@
#!/bin/bash
GIT_REPO=$1
GIT_USER=$2
GIT_TOKEN=$3
#wget https://github.com/keptn/keptn/releases/download/1.4.0/keptn-1.4.0-linux-amd64.tar.gz
#tar -xvf keptn-1.4.0-linux-amd64.tar.gz
pwd
ls -la
keptn create project carts --shipyard ../shipyard.yaml --git-remote-url $GIT_REPO --git-user $GIT_USER --git-token $GIT_TOKEN
keptn create service carts --project=carts
keptn create service carts-db --project=carts
keptn add-resource --project=carts --service=carts --all-stages --resource=../carts.tgz --resourceUri=charts/carts.tgz
keptn add-resource --project=carts --service=carts-db --all-stages --resource=../carts-db.tgz --resourceUri=charts/carts-db.tgz
keptn add-resource --project=carts --service=carts --all-stages --resource=../job-executer/job-cart.yaml --resourceUri=job/config.yaml
keptn add-resource --project=carts --service=carts-db --all-stages --resource=../job-executer/job-cart-db.yaml --resourceUri=job/config.yaml
keptn add-resource --project=carts --service=carts --all-stages --resource=../locust/basic.py --resourceUri=locust/basic.py
keptn add-resource --project=carts --service=carts --all-stages --resource=../locust/locust.conf --resourceUri=locust/locust.conf
#Execute deployment
keptn trigger delivery --project=carts --service=carts-db --image="mongo:4.2.2" --labels=image="keptnexamples/carts-db:4.2.2",version="4.2.2" --sequence=delivery-direct
keptn trigger delivery --project=carts --service=carts --image="docker.io/keptnexamples/carts:0.13.1" --labels=image="keptnexamples/carts:0.13.1",version="0.13.1"

View File

@ -1,186 +0,0 @@
locals {
is_linux = length(regexall("/home/", lower(abspath(path.root)))) > 0
}
resource "gitea_repository" "demo-repo" {
username = var.GITEA_USER
name = "sockshop-demo-test"
private = false
issue_labels = "Default"
license = "MIT"
}
resource "null_resource" "seed-win-apply" {
count = local.is_linux ? 0 : 1
# program = ["cmd","/c","${abspath(path.module)}/bin/keptn-seed-project.bat",gitea_repository.demo-repo.clone_url, var.GITEA_USER, var.GITEA_TOKEN]
triggers = {
mode = "apply"
repo = gitea_repository.demo-repo.clone_url
user = var.GITEA_USER
token = var.GITEA_TOKEN
}
provisioner "local-exec" {
when = create
#interpreter = ["Powershell", "-Command"]
# environment = {
# mode = "apply"
# repo = gitea_repository.demo-repo.clone_url
# user = var.GITEA_USER
# token = var.GITEA_TOKEN
# }
command = "cmd /c ${abspath(path.module)}/bin/keptn-seed-project.bat ${self.triggers.repo} ${self.triggers.user} ${self.triggers.token}"
#interpreter = ["cmd","/c","${abspath(path.module)}/bin/keptn-seed-project.bat",, var.GITEA_USER, var.GITEA_TOKEN]
}
}
resource "null_resource" "seed-unix-apply" {
count = local.is_linux ? 1 : 0
# program = ["cmd","/c","${abspath(path.module)}/bin/keptn-seed-project.bat",gitea_repository.demo-repo.clone_url, var.GITEA_USER, var.GITEA_TOKEN]
triggers = {
mode = "apply"
repo = gitea_repository.demo-repo.clone_url
user = var.GITEA_USER
token = var.GITEA_TOKEN
}
provisioner "local-exec" {
when = create
#interpreter = ["Powershell", "-Command"]
# environment = {
# mode = "apply"
# repo = gitea_repository.demo-repo.clone_url
# user = var.GITEA_USER
# token = var.GITEA_TOKEN
# }
command = "/bin/bash ${abspath(path.module)}/bin/keptn-seed-project.sh ${self.triggers.repo} ${self.triggers.user} ${self.triggers.token}"
#interpreter = ["cmd","/c","${abspath(path.module)}/bin/keptn-seed-project.bat",, var.GITEA_USER, var.GITEA_TOKEN]
}
depends_on = [kubernetes_namespace.carts-dev, kubernetes_namespace.carts-staging, kubernetes_namespace.carts-prod]
}
resource "null_resource" "seed-win-destroy" {
count = local.is_linux ? 0 : 1
# program = ["cmd","/c","${abspath(path.module)}/bin/keptn-seed-project.bat",gitea_repository.demo-repo.clone_url, var.GITEA_USER, var.GITEA_TOKEN]
triggers = {
mode = "destroy"
repo = gitea_repository.demo-repo.clone_url
user = var.GITEA_USER
token = var.GITEA_TOKEN
}
provisioner "local-exec" {
when = destroy
#interpreter = ["Powershell", "-Command"]
# environment = {
# mode = "destroy"
# repo = gitea_repository.demo-repo.clone_url
# user = var.GITEA_USER
# token = var.GITEA_TOKEN
# }
command = "cmd /c ${abspath(path.module)}/bin/keptn-destroy-project.bat"
#interpreter = ["cmd","/c","${abspath(path.module)}/bin/keptn-seed-project.bat",, var.GITEA_USER, var.GITEA_TOKEN]
}
}
resource "null_resource" "seed-unix-destroy" {
count = local.is_linux ? 1 : 0
# program = ["cmd","/c","${abspath(path.module)}/bin/keptn-seed-project.bat",gitea_repository.demo-repo.clone_url, var.GITEA_USER, var.GITEA_TOKEN]
triggers = {
mode = "destroy"
repo = gitea_repository.demo-repo.clone_url
user = var.GITEA_USER
token = var.GITEA_TOKEN
}
provisioner "local-exec" {
when = destroy
#interpreter = ["Powershell", "-Command"]
# environment = {
# mode = "destroy"
# repo = gitea_repository.demo-repo.clone_url
# user = var.GITEA_USER
# token = var.GITEA_TOKEN
# }
command = "/bin/bash ${abspath(path.module)}/bin/keptn-destroy-project.sh"
#interpreter = ["cmd","/c","${abspath(path.module)}/bin/keptn-seed-project.bat",, var.GITEA_USER, var.GITEA_TOKEN]
}
}
data "restful_resource" "ExecutorId" {
id = "/api/controlPlane/v1/uniform/registration"
method = "GET"
query = {
name=["job-executor-service"]
}
#selector = "0.id" data.restful_resource.ExecutorId.output[0].id
}
resource "restful_operation" "add_subscription" {
path = "/api/controlPlane/v1/uniform/registration/${data.restful_resource.ExecutorId.output[0].id}/subscription"
#delete_path = "/api/controlPlane/v1/uniform/registration/${data.restful_resource.ExecutorId.output[0].id}/subscription/${data.restful_resource.Subscriptions.output[0].id}"
method = "POST"
#delete_method = "DELETE"
#precheck_delete = local.subid_precheck
body = {
"event": "sh.keptn.event.uninstall.triggered",
"filter": {
"projects": ["carts"],
"stages": null,
"services": ["carts","carts-db"]
}
}
depends_on = [ null_resource.seed-unix-apply ]
}
resource "kubernetes_namespace" "carts-dev" {
metadata {
name = "carts-dev"
labels = {"monitor":"dynatrace"}
}
}
resource "kubernetes_namespace" "carts-staging" {
metadata {
name = "carts-staging"
labels = {"monitor":"dynatrace"}
}
}
resource "kubernetes_namespace" "carts-prod" {
metadata {
name = "carts-production"
labels = {"monitor":"dynatrace"}
}
}
# resource "seed" "win" {
# count = local.is_linux ? 0 : 1
# provisioner "local-exec" {
# command = "echo $FOO $BAR $BAZ >> env_vars.txt"
# environment = {
# FOO = var.gitea_repository.demo-repo.clone_url
# }
# }
# }

View File

@ -1 +0,0 @@
terraform init -backend-config="key=keptn-sockshop-demo"

View File

@ -1,62 +0,0 @@
# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: MPL-2.0
terraform {
backend "s3" {
bucket = "terraform-xops-demos"
region = "us-west-2"
dynamodb_table = "terraform-xops-lock-state"
encrypt = true
}
required_providers {
gitea = {
source = "Lerentis/gitea"
version = "0.16.0"
}
restful = {
source = "magodo/restful"
}
kubernetes = {
source = "hashicorp/kubernetes"
version = ">= 2.0.0"
}
}
required_version = "~> 1.3"
}
provider "gitea" {
# Configuration options
base_url = var.GITEA_URL # optionally use GITEA_BASE_URL env var
token = var.GITEA_TOKEN # optionally use GITEA_TOKEN env var
#username = var.GITEA_USER
# password = var.GITEA_PASSWORD
}
provider "restful" {
base_url = "https://keptn.nttdata-xlabs.com"
client = {
tls_insecure_skip_verify=true
}
security = {
apikey = [
{
in = "header"
name = "x-token"
value = var.KEPTN_API_TOKEN
},
]
}
}

View File

@ -1,32 +0,0 @@
variable "GITEA_USER" {
type = string
description = "gitea User"
default = "demo"
}
variable "GITEA_URL" {
type = string
description = "url to gitea"
default = "https://gitea.nttdata-xlabs.com"
}
# variable "GITEA_PASSWORD" {
# type = string
# description = "url to gitea"
# }
variable "GITEA_TOKEN" {
type = string
description = ""
}
variable "KEPTN_BRIDGE_URL" {
type = string
description = ""
}
variable "KEPTN_API_TOKEN" {
type = string
description = ""
}