From f49bd1efeaaddd4891c1f329b18d8cfb28b3e75b Mon Sep 17 00:00:00 2001 From: Rohan Patel Date: Mon, 23 Sep 2019 15:04:19 -0400 Subject: [PATCH] adding vth code as well as aaf and cert config Change-Id: Ib137099ccac3109b9b38deab1c42ffade5d6a303 Signed-off-by: Rohan Patel --- LICENSE.txt | 28 +++ otf-aaf-credential-generator/Jenkinsfile | 112 +++++++++++ .../aaf_cadi_core_2.1.10_SNAPSHOT.jar | Bin 0 -> 223867 bytes .../helm/otf-aaf-credential-generator/.helmignore | 21 ++ .../helm/otf-aaf-credential-generator/Chart.yaml | 5 + .../templates/secret.yaml | 11 ++ .../helm/otf-aaf-credential-generator/values.yaml | 9 + otf-cert-secret-builder/Jenkinsfile | 137 +++++++++++++ .../helm/otf-cert-secret-builder/.helmignore | 21 ++ .../helm/otf-cert-secret-builder/Chart.yaml | 5 + .../otf-cert-secret-builder/templates/secret.yaml | 13 ++ .../helm/otf-cert-secret-builder/values.yaml | 12 ++ otf-ping-test-head/.gitignore | 5 + otf-ping-test-head/Dockerfile | 17 ++ otf-ping-test-head/Jenkinsfile | 141 ++++++++++++++ otf-ping-test-head/LICENSE.txt | 28 +++ .../helm/otf-ping-test-head/.helmignore | 21 ++ .../helm/otf-ping-test-head/Chart.yaml | 5 + .../otf-ping-test-head/templates/deployment.yaml | 113 +++++++++++ .../helm/otf-ping-test-head/templates/service.yaml | 18 ++ .../helm/otf-ping-test-head/values.yaml | 12 ++ otf-ping-test-head/opt/cert/certInfo.txt | 1 + otf-ping-test-head/otfPingTestHead.py | 196 +++++++++++++++++++ otf-ping-test-head/pip-requirements.txt | 6 + otf-robot-test-head/.gitignore | 211 +++++++++++++++++++++ otf-robot-test-head/Dockerfile | 18 ++ otf-robot-test-head/Jenkinsfile | 150 +++++++++++++++ otf-robot-test-head/LICENSE.txt | 28 +++ otf-robot-test-head/app/__init__.py | 36 ++++ otf-robot-test-head/app/configuration.py | 41 ++++ otf-robot-test-head/app/database.py | 55 ++++++ otf-robot-test-head/app/routes/__init__.py | 22 +++ otf-robot-test-head/app/routes/health.py | 23 +++ otf-robot-test-head/app/routes/robot_processor.py | 164 ++++++++++++++++ otf-robot-test-head/app/utils/__init__.py | 62 ++++++ .../helm/otf-robot-test-head/.helmignore | 21 ++ .../helm/otf-robot-test-head/Chart.yaml | 5 + .../otf-robot-test-head/templates/deployment.yaml | 151 +++++++++++++++ .../helm/otf-robot-test-head/templates/secret.yaml | 8 + .../otf-robot-test-head/templates/service.yaml | 18 ++ .../helm/otf-robot-test-head/values.yaml | 31 +++ otf-robot-test-head/opt/cert/CERT_PLACEHOLDER | 0 otf-robot-test-head/pip-requirements.txt | 6 + otf-robot-test-head/run.py | 14 ++ otf-ssh-test-head/.gitignore | 5 + otf-ssh-test-head/Dockerfile | 17 ++ otf-ssh-test-head/Jenkinsfile | 157 +++++++++++++++ otf-ssh-test-head/LICENSE.txt | 28 +++ .../helm/otf-ssh-test-head/.helmignore | 21 ++ .../helm/otf-ssh-test-head/Chart.yaml | 5 + .../otf-ssh-test-head/templates/deployment.yaml | 128 +++++++++++++ .../helm/otf-ssh-test-head/templates/secret.yaml | 8 + .../helm/otf-ssh-test-head/templates/service.yaml | 18 ++ .../helm/otf-ssh-test-head/values.yaml | 17 ++ otf-ssh-test-head/opt/cert/certInfo.txt | 1 + otf-ssh-test-head/pip-requirements.txt | 6 + otf-ssh-test-head/ssh_test_head.py | 161 ++++++++++++++++ 57 files changed, 2573 insertions(+) create mode 100644 LICENSE.txt create mode 100644 otf-aaf-credential-generator/Jenkinsfile create mode 100644 otf-aaf-credential-generator/aaf_cadi_core_2.1.10_SNAPSHOT.jar create mode 100644 otf-aaf-credential-generator/helm/otf-aaf-credential-generator/.helmignore create mode 100644 otf-aaf-credential-generator/helm/otf-aaf-credential-generator/Chart.yaml create mode 100644 otf-aaf-credential-generator/helm/otf-aaf-credential-generator/templates/secret.yaml create mode 100644 otf-aaf-credential-generator/helm/otf-aaf-credential-generator/values.yaml create mode 100644 otf-cert-secret-builder/Jenkinsfile create mode 100644 otf-cert-secret-builder/helm/otf-cert-secret-builder/.helmignore create mode 100644 otf-cert-secret-builder/helm/otf-cert-secret-builder/Chart.yaml create mode 100644 otf-cert-secret-builder/helm/otf-cert-secret-builder/templates/secret.yaml create mode 100644 otf-cert-secret-builder/helm/otf-cert-secret-builder/values.yaml create mode 100644 otf-ping-test-head/.gitignore create mode 100644 otf-ping-test-head/Dockerfile create mode 100644 otf-ping-test-head/Jenkinsfile create mode 100644 otf-ping-test-head/LICENSE.txt create mode 100644 otf-ping-test-head/helm/otf-ping-test-head/.helmignore create mode 100644 otf-ping-test-head/helm/otf-ping-test-head/Chart.yaml create mode 100644 otf-ping-test-head/helm/otf-ping-test-head/templates/deployment.yaml create mode 100644 otf-ping-test-head/helm/otf-ping-test-head/templates/service.yaml create mode 100644 otf-ping-test-head/helm/otf-ping-test-head/values.yaml create mode 100644 otf-ping-test-head/opt/cert/certInfo.txt create mode 100644 otf-ping-test-head/otfPingTestHead.py create mode 100644 otf-ping-test-head/pip-requirements.txt create mode 100644 otf-robot-test-head/.gitignore create mode 100644 otf-robot-test-head/Dockerfile create mode 100644 otf-robot-test-head/Jenkinsfile create mode 100644 otf-robot-test-head/LICENSE.txt create mode 100644 otf-robot-test-head/app/__init__.py create mode 100644 otf-robot-test-head/app/configuration.py create mode 100644 otf-robot-test-head/app/database.py create mode 100644 otf-robot-test-head/app/routes/__init__.py create mode 100644 otf-robot-test-head/app/routes/health.py create mode 100644 otf-robot-test-head/app/routes/robot_processor.py create mode 100644 otf-robot-test-head/app/utils/__init__.py create mode 100644 otf-robot-test-head/helm/otf-robot-test-head/.helmignore create mode 100644 otf-robot-test-head/helm/otf-robot-test-head/Chart.yaml create mode 100644 otf-robot-test-head/helm/otf-robot-test-head/templates/deployment.yaml create mode 100644 otf-robot-test-head/helm/otf-robot-test-head/templates/secret.yaml create mode 100644 otf-robot-test-head/helm/otf-robot-test-head/templates/service.yaml create mode 100644 otf-robot-test-head/helm/otf-robot-test-head/values.yaml create mode 100644 otf-robot-test-head/opt/cert/CERT_PLACEHOLDER create mode 100644 otf-robot-test-head/pip-requirements.txt create mode 100644 otf-robot-test-head/run.py create mode 100644 otf-ssh-test-head/.gitignore create mode 100644 otf-ssh-test-head/Dockerfile create mode 100644 otf-ssh-test-head/Jenkinsfile create mode 100644 otf-ssh-test-head/LICENSE.txt create mode 100644 otf-ssh-test-head/helm/otf-ssh-test-head/.helmignore create mode 100644 otf-ssh-test-head/helm/otf-ssh-test-head/Chart.yaml create mode 100644 otf-ssh-test-head/helm/otf-ssh-test-head/templates/deployment.yaml create mode 100644 otf-ssh-test-head/helm/otf-ssh-test-head/templates/secret.yaml create mode 100644 otf-ssh-test-head/helm/otf-ssh-test-head/templates/service.yaml create mode 100644 otf-ssh-test-head/helm/otf-ssh-test-head/values.yaml create mode 100644 otf-ssh-test-head/opt/cert/certInfo.txt create mode 100644 otf-ssh-test-head/pip-requirements.txt create mode 100644 otf-ssh-test-head/ssh_test_head.py diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..aa73a11 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,28 @@ +Unless otherwise specified, all software contained herein is licensed +under the Apache License, Version 2.0 (the "Software License"); +you may not use this software except in compliance with the Software +License. You may obtain a copy of the Software License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the Software License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the Software License for the specific language governing permissions +and limitations under the Software License. + + + +Unless otherwise specified, all documentation contained herein is licensed +under the Creative Commons License, Attribution 4.0 Intl. (the +"Documentation License"); you may not use this documentation except in +compliance with the Documentation License. You may obtain a copy of the +Documentation License at + +https://creativecommons.org/licenses/by/4.0/ + +Unless required by applicable law or agreed to in writing, documentation +distributed under the Documentation License is distributed on an "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied. See the Documentation License for the specific language governing +permissions and limitations under the Documentation License. \ No newline at end of file diff --git a/otf-aaf-credential-generator/Jenkinsfile b/otf-aaf-credential-generator/Jenkinsfile new file mode 100644 index 0000000..c2d0b5c --- /dev/null +++ b/otf-aaf-credential-generator/Jenkinsfile @@ -0,0 +1,112 @@ +#!/usr/bin/env groovy + + +properties([[$class: 'ParametersDefinitionProperty', parameterDefinitions: [ + [$class: 'hudson.model.StringParameterDefinition', name: 'PHASE', defaultValue: "BUILD"], + [$class: 'hudson.model.StringParameterDefinition', name: 'ENV', defaultValue: "dev"], + [$class: 'hudson.model.StringParameterDefinition', name: 'MECHID', defaultValue: "id"], + [$class: 'hudson.model.StringParameterDefinition', name: 'KUBE_CONFIG', defaultValue: "kubeConfig-dev"], + [$class: 'hudson.model.StringParameterDefinition', name: 'TILLER_NAMESPACE', defaultValue: "org-onap-otf"] +]]]) + + +echo "Build branch: ${env.BRANCH_NAME}" + +node("docker"){ + stage 'Checkout' + checkout scm + PHASES=PHASE.tokenize( '_' ); + echo "PHASES : " + PHASES + ARTIFACT_ID="otf-aaf-credential-generator" + echo "Tiller Namespace: " + TILLER_NAMESPACE + + withEnv(["PATH=${env.PATH}:${tool 'jdk180'}:${env.WORKSPACE}/linux-amd64", "JAVA_HOME=${tool 'jdk180'}","HELM_HOME=${env.WORKSPACE}"]) { + + echo "PATH=${env.PATH}" + echo "JAVA_HOME=${env.JAVA_HOME}" + echo "HELM_HOME=${env.HELM_HOME}" + + wrap([$class: 'ConfigFileBuildWrapper', managedFiles: [ + [fileId: 'maven-settings.xml', variable: 'MAVEN_SETTINGS'] + ]]) { + + if (PHASES.contains("DEPLOY") || PHASES.contains("UNDEPLOY")) { + stage 'Init Helm' + + //check if helm exists if not install + if(fileExists('linux-amd64/helm')){ + sh """ + echo "helm is already installed" + """ + } + else{ + //download helm + sh """ + echo "installing helm" + wget https://storage.googleapis.com/kubernetes-helm/helm-v2.8.2-linux-amd64.tar.gz + tar -xf helm-v2.8.2-linux-amd64.tar.gz + rm helm-v2.8.2-linux-amd64.tar.gz + """ + } + + withCredentials([file(credentialsId: KUBE_CONFIG, variable: 'KUBECONFIG')]) { + + dir('helm'){ + //check if charts are valid, and then perform dry run, if successful then upgrade/install charts + + if (PHASES.contains("UNDEPLOY") ) { + stage 'Undeploy' + + sh """ + helm delete --tiller-namespace=$TILLER_NAMESPACE --purge $ARTIFACT_ID + """ + } + + //NOTE Double quotes are used below to access groovy variables like artifact_id and tiller_namespace + if (PHASES.contains("DEPLOY") ){ + stage 'Deploy' + withCredentials([usernamePassword(credentialsId: MECHID, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) { + + //Note: KEYFILE_PATH must be within helm/$ARTIFACT_ID and must be relative path starting from that directory + sh """ + + echo "Remove old key info" + rm -rf keyfile; + rm -rf digest.txt + rm -rf $ARTIFACT_ID/keyfile + + ls + echo "Create keyfile and digest" + java -jar ../aaf_cadi_core_2.1.10_SNAPSHOT.jar keygen keyfile + java -jar ../aaf_cadi_core_2.1.10_SNAPSHOT.jar digest $PASSWORD keyfile > digest.txt 2>&1 + + cp keyfile $ARTIFACT_ID + KEYFILE_PATH=keyfile + DIGEST="enc:" + DIGEST+=\$(cat digest.txt) + echo \$DIGEST + echo "Validate Yaml" + helm lint $ARTIFACT_ID + + echo "View Helm Templates" + helm template $ARTIFACT_ID --set Secret.aafId=$USERNAME --set Secret.aafPassword=\$DIGEST --set Secret.aafMechPassword=$PASSWORD --set keyfilePath=\$KEYFILE_PATH + + echo "Perform Dry Run Of Install" + helm upgrade --tiller-namespace=$TILLER_NAMESPACE --install --dry-run $ARTIFACT_ID $ARTIFACT_ID --set Secret.aafId=$USERNAME --set Secret.aafPassword=\$DIGEST --set Secret.aafMechPassword=$PASSWORD --set keyfilePath=\$KEYFILE_PATH + + echo "Helm Install/Upgrade" + helm upgrade --tiller-namespace=$TILLER_NAMESPACE --install $ARTIFACT_ID $ARTIFACT_ID --set Secret.aafId=$USERNAME --set Secret.aafPassword=\$DIGEST --set Secret.aafMechPassword=$PASSWORD --set keyfilePath=\$KEYFILE_PATH + + rm -rf $ARTIFACT_ID/keyfile + rm -rf keyfile + rm -rf digest.txt + """ + } + } + + } + } + } + } + } +} \ No newline at end of file diff --git a/otf-aaf-credential-generator/aaf_cadi_core_2.1.10_SNAPSHOT.jar b/otf-aaf-credential-generator/aaf_cadi_core_2.1.10_SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..9c7b105d6a8b61457283f5f7ece1d7474df1d0f2 GIT binary patch literal 223867 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
x`!njU*eCya0 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

QF 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

@4N!=C5hhaA-2~G3M}7#=bRYO!?{4hi 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

A)bA75||QO%%aZz?eK!GGd)7;-_15 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

aY>W(!J+Sh}aQUr}yW#^ki`z7Geu| zvwE`y#l9jC=BA_KXRk3~h!Rb78IzygR(C=jO-w`EdtPrAvhldtLJs<-U1u_7(5jQv z2eogph?1nhh9(T1P>-IfVgnp01aRliX7!8aLD6PQ%H^zh{7WNOd=7Kp#(ok#?6om0 z9y!HGTwTW{S{L2gZ$Js~2z>!s!lG0j5u0gT-j~yw?VA8QcR*GMbq*JQZPtiUJRWIZ zaDm}9LoT0y3O52uucuFrM3Q6U=%d$4KGsqZJWDhK_G%;n2)rYD#KX}Pn@Gb#kehE zzD4fn)$XmM1EOFZBUDOzd%zSXnY_9+MJ|2s&M8kwgmK1Ty+!xe)|y#F_X%Emt4(-V)2PghaqNxe| zvU3?*e}*$-k4fdqo<{$p7n;4cBSl) zx>%k*OsnS<@-0=XmXJ8`4=}?i=Fuhc%oO67{YkCdgxJlCKTSH0Tg=9i5J#6?Kbv*p za`{`(_Eg&cHHCA`xF-9~^(|mu#}(qb2T6{_C9JzNmBLJ&k^>^)@Oh9NN2^^wn>BA0 zi^ol}MW)m_Du8YQMCX^f)l5)B`OFR^56<*{m%!czjP~AXpRi!|hZ{!4;bC-(a=4Hq zW;XmY8*aXs{P_yN&j3z08vNHZ1&`Bb#_8-GR5tr$s|7c(Ojm@#&*+l>=~^y3L#2vK z#lD+p;%(~8_P!V)ba$g`SbGkv`aR*4}@r!x|vS86L9)cmoTR`l$X*k`h2!K{;GwrD4@}e~4AU#{a zxBBJ2QiM@2gOIOMqb{rB0!KCIkz^q@_1&eL-y{>@A{>9y@E=a!oLxqdg{W@j))w z?O(idzR#71f6Ruw>wuV@FA6zlz0IoqgGFl82A64oOTWb9rWVz+sEwN)Jl~dnuf@$Q zZ`OjLJXaq|^7R&J4_Equ4L5gOOBUDObY<)v6KzUg_3vhN_GYo%+Vr%JeR(c<4Un6c z7R2J&Wpiw@Nr|2hX~PR0zn2vC^(nzE+)rCO-?Za?Y+Cwao)G7Mi|3!~>kB>qW4N>D zn|Js;cV-~GozKOSzKO?4XTOWbDX`7z8{#okhO{)@@n)XJ-otvD-+hx_SaZ3aUT@In ebKS(~dbU4xm=}VDLQ#eP2}AH~dr!nS#s2}r%}GN5 literal 0 HcmV?d00001 diff --git a/otf-aaf-credential-generator/helm/otf-aaf-credential-generator/.helmignore b/otf-aaf-credential-generator/helm/otf-aaf-credential-generator/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/otf-aaf-credential-generator/helm/otf-aaf-credential-generator/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/otf-aaf-credential-generator/helm/otf-aaf-credential-generator/Chart.yaml b/otf-aaf-credential-generator/helm/otf-aaf-credential-generator/Chart.yaml new file mode 100644 index 0000000..985ce22 --- /dev/null +++ b/otf-aaf-credential-generator/helm/otf-aaf-credential-generator/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +appVersion: "1.0" +description: A Helm chart for OTF secret shared secret files +name: otf-aaf-credential-generator +version: 0.1.0 diff --git a/otf-aaf-credential-generator/helm/otf-aaf-credential-generator/templates/secret.yaml b/otf-aaf-credential-generator/helm/otf-aaf-credential-generator/templates/secret.yaml new file mode 100644 index 0000000..44a4be1 --- /dev/null +++ b/otf-aaf-credential-generator/helm/otf-aaf-credential-generator/templates/secret.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Values.appName}} +type: Opaque +data: + cadi_keyfile: {{ .Files.Get .Values.keyfilePath | b64enc }} + aaf_id: {{ .Values.Secret.aafId | b64enc}} + aaf_password: {{ .Values.Secret.aafPassword | b64enc}} + aaf_mech_password: {{ .Values.Secret.aafMechPassword | b64enc}} + keyfile_secret_path: {{.Values.Secret.keyfileSecretPath | b64enc}} diff --git a/otf-aaf-credential-generator/helm/otf-aaf-credential-generator/values.yaml b/otf-aaf-credential-generator/helm/otf-aaf-credential-generator/values.yaml new file mode 100644 index 0000000..003e3ba --- /dev/null +++ b/otf-aaf-credential-generator/helm/otf-aaf-credential-generator/values.yaml @@ -0,0 +1,9 @@ +appName: otf-aaf-credential-generator + +keyfilePath: keyfile + +Secret: + keyfileSecretPath: /opt/secret/keyfile + aafId: id + aafPassword: pass + aafMechPassword: mechPass \ No newline at end of file diff --git a/otf-cert-secret-builder/Jenkinsfile b/otf-cert-secret-builder/Jenkinsfile new file mode 100644 index 0000000..e9f31ff --- /dev/null +++ b/otf-cert-secret-builder/Jenkinsfile @@ -0,0 +1,137 @@ +#!/usr/bin/env groovy + + +properties([[$class: 'ParametersDefinitionProperty', parameterDefinitions: [ + [$class: 'hudson.model.StringParameterDefinition', name: 'PHASE', defaultValue: "BUILD"], + [$class: 'hudson.model.StringParameterDefinition', name: 'ENV', defaultValue: "dev"], + [$class: 'hudson.model.StringParameterDefinition', name: 'MECHID', defaultValue: "id"], + [$class: 'hudson.model.StringParameterDefinition', name: 'KUBE_CONFIG', defaultValue: "kubeConfig-dev"], + [$class: 'hudson.model.StringParameterDefinition', name: 'TILLER_NAMESPACE', defaultValue: "org-onar-otf"], + [$class: 'hudson.model.StringParameterDefinition', name: 'PKCS12_CERT', defaultValue: "otf_ssl_pkcs12_dev"], + [$class: 'hudson.model.StringParameterDefinition', name: 'PKCS12_KEY', defaultValue: "server_ssl_key_store_password"], + [$class: 'hudson.model.StringParameterDefinition', name: 'PEM_CERT', defaultValue: "otf_ssl_pem_dev"], + [$class: 'hudson.model.StringParameterDefinition', name: 'PEM_KEY', defaultValue: "otf_ssl_pem_key_dev"] + + +]]]) + + +echo "Build branch: ${env.BRANCH_NAME}" + +node("docker"){ + stage 'Checkout' + checkout scm + PHASES=PHASE.tokenize( '_' ); + echo "PHASES : " + PHASES + ARTIFACT_ID="otf-cert-secret-builder" + echo "Tiller Namespace: " + TILLER_NAMESPACE + + withEnv(["PATH=${env.PATH}:${tool 'jdk180'}:${env.WORKSPACE}/linux-amd64", "JAVA_HOME=${tool 'jdk180'}","HELM_HOME=${env.WORKSPACE}"]) { + + echo "PATH=${env.PATH}" + echo "JAVA_HOME=${env.JAVA_HOME}" + echo "HELM_HOME=${env.HELM_HOME}" + + wrap([$class: 'ConfigFileBuildWrapper', managedFiles: [ + [fileId: 'maven-settings.xml', variable: 'MAVEN_SETTINGS'] + ]]) { + + if (PHASES.contains("DEPLOY") || PHASES.contains("UNDEPLOY")) { + stage 'Init Helm' + + //check if helm exists if not install + if(fileExists('linux-amd64/helm')){ + sh """ + echo "helm is already installed" + """ + } + else{ + //download helm + sh """ + echo "installing helm" + wget https://storage.googleapis.com/kubernetes-helm/helm-v2.8.2-linux-amd64.tar.gz + tar -xf helm-v2.8.2-linux-amd64.tar.gz + rm helm-v2.8.2-linux-amd64.tar.gz + """ + } + + withCredentials([file(credentialsId: KUBE_CONFIG, variable: 'KUBECONFIG')]) { + + dir('helm'){ + //check if charts are valid, and then perform dry run, if successful then upgrade/install charts + + if (PHASES.contains("UNDEPLOY") ) { + stage 'Undeploy' + + sh """ + helm delete --tiller-namespace=$TILLER_NAMESPACE --purge $ARTIFACT_ID + """ + } + + //NOTE Double quotes are used below to access groovy variables like artifact_id and tiller_namespace + if (PHASES.contains("DEPLOY") ){ + stage 'Deploy' + withCredentials( + [usernamePassword(credentialsId: MECHID, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD'), + file(credentialsId: PKCS12_CERT, variable: 'VAR_PKCS12_CERT'), + string(credentialsId: PKCS12_KEY, variable: 'VAR_PKCS12_KEY'), + file(credentialsId: PEM_CERT, variable: 'VAR_PEM_CERT'), + file(credentialsId: PEM_KEY, variable: 'VAR_PEM_KEY'), + file(credentialsId: 'PRIVATE_KEY', variable: 'VAR_PRIVATE_KEY'), + usernamePassword(credentialsId: 'PRIVATE_KEY_USER_PASS', usernameVariable: 'PRIVATE_KEY_USERNAME', passwordVariable: 'PRIVATE_KEY_PASSPHRASE') + ]) { + + sh """ + + cp $VAR_PKCS12_CERT $ARTIFACT_ID + cp $VAR_PEM_CERT $ARTIFACT_ID + cp $VAR_PEM_KEY $ARTIFACT_ID + cp $VAR_PRIVATE_KEY $ARTIFACT_ID + FILE_PKCS12_CERT=`basename $VAR_PKCS12_CERT` + FILE_PEM_CERT=`basename $VAR_PEM_CERT` + FILE_PEM_KEY=`basename $VAR_PEM_KEY` + FILE_PRIVATE_KEY=`basename $VAR_PRIVATE_KEY` + + echo "Validate Yaml" + helm lint $ARTIFACT_ID + + echo "View Helm Templates" + helm template $ARTIFACT_ID \ + --set Secret.PKCS12_CERT=\$FILE_PKCS12_CERT \ + --set Secret.PKCS12_KEY=$VAR_PKCS12_KEY \ + --set Secret.PEM_CERT=\$FILE_PEM_CERT \ + --set Secret.PEM_KEY=\$FILE_PEM_KEY \ + --set Secret.privateKey.key=\$FILE_PRIVATE_KEY \ + --set Secret.privateKey.username=$PRIVATE_KEY_USERNAME \ + --set Secret.privateKey.passphrase=$PRIVATE_KEY_PASSPHRASE \ + + echo "Perform Dry Run Of Install" + helm upgrade --tiller-namespace=$TILLER_NAMESPACE --install --dry-run $ARTIFACT_ID $ARTIFACT_ID \ + --set Secret.PKCS12_CERT=\$FILE_PKCS12_CERT \ + --set Secret.PKCS12_KEY=$VAR_PKCS12_KEY \ + --set Secret.PEM_CERT=\$FILE_PEM_CERT \ + --set Secret.PEM_KEY=\$FILE_PEM_KEY \ + --set Secret.privateKey.key=\$FILE_PRIVATE_KEY \ + --set Secret.privateKey.username=$PRIVATE_KEY_USERNAME \ + --set Secret.privateKey.passphrase=$PRIVATE_KEY_PASSPHRASE \ + + echo "Helm Install/Upgrade" + helm upgrade --tiller-namespace=$TILLER_NAMESPACE --install $ARTIFACT_ID $ARTIFACT_ID \ + --set Secret.PKCS12_CERT=\$FILE_PKCS12_CERT \ + --set Secret.PKCS12_KEY=$VAR_PKCS12_KEY \ + --set Secret.PEM_CERT=\$FILE_PEM_CERT \ + --set Secret.PEM_KEY=\$FILE_PEM_KEY \ + --set Secret.privateKey.key=\$FILE_PRIVATE_KEY \ + --set Secret.privateKey.username=$PRIVATE_KEY_USERNAME \ + --set Secret.privateKey.passphrase=$PRIVATE_KEY_PASSPHRASE \ + + """ + } + } + + } + } + } + } + } +} diff --git a/otf-cert-secret-builder/helm/otf-cert-secret-builder/.helmignore b/otf-cert-secret-builder/helm/otf-cert-secret-builder/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/otf-cert-secret-builder/helm/otf-cert-secret-builder/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/otf-cert-secret-builder/helm/otf-cert-secret-builder/Chart.yaml b/otf-cert-secret-builder/helm/otf-cert-secret-builder/Chart.yaml new file mode 100644 index 0000000..aada663 --- /dev/null +++ b/otf-cert-secret-builder/helm/otf-cert-secret-builder/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +appVersion: "1.0" +description: A Helm chart for OTF certificate secret shared secret files +name: otf-cert-secret-builder +version: 0.1.0 diff --git a/otf-cert-secret-builder/helm/otf-cert-secret-builder/templates/secret.yaml b/otf-cert-secret-builder/helm/otf-cert-secret-builder/templates/secret.yaml new file mode 100644 index 0000000..2179d4e --- /dev/null +++ b/otf-cert-secret-builder/helm/otf-cert-secret-builder/templates/secret.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Values.appName}} +type: Opaque +data: + PKCS12_CERT: {{ .Files.Get .Values.Secret.PKCS12_CERT | b64enc }} + PKCS12_KEY: {{ .Values.Secret.PKCS12_KEY | b64enc}} + PEM_CERT: {{ .Files.Get .Values.Secret.PEM_CERT | b64enc}} + PEM_KEY: {{ .Files.Get .Values.Secret.PEM_KEY | b64enc}} + private_key: {{ .Files.Get .Values.Secret.privateKey.key | b64enc}} + private_key_username: {{ .Values.Secret.privateKey.username | b64enc}} + private_key_passphrase: {{ .Values.Secret.privateKey.passphrase | b64enc}} diff --git a/otf-cert-secret-builder/helm/otf-cert-secret-builder/values.yaml b/otf-cert-secret-builder/helm/otf-cert-secret-builder/values.yaml new file mode 100644 index 0000000..6898616 --- /dev/null +++ b/otf-cert-secret-builder/helm/otf-cert-secret-builder/values.yaml @@ -0,0 +1,12 @@ +appName: otf-cert-secret-builder + +Secret: + PKCS12_CERT: temp + PKCS12_KEY: temp + PEM_CERT: temp + PEM_KEY: temp + SSH_PRIVATE_KEY: temp + privateKey: + username: id + passphrase: passphrase + key: tmp diff --git a/otf-ping-test-head/.gitignore b/otf-ping-test-head/.gitignore new file mode 100644 index 0000000..28ca722 --- /dev/null +++ b/otf-ping-test-head/.gitignore @@ -0,0 +1,5 @@ +otf.pem +privateKey.pem +*.log +*.pem +/otf diff --git a/otf-ping-test-head/Dockerfile b/otf-ping-test-head/Dockerfile new file mode 100644 index 0000000..0ebb8f8 --- /dev/null +++ b/otf-ping-test-head/Dockerfile @@ -0,0 +1,17 @@ +FROM python:2.7 + +ARG HTTP_PROXY="localhost:8080" +ARG HTTPS_PROXY="localhost:8080" +ARG http_proxy="localhost:8080" +ARG https_proxy="localhost:8080" + +RUN python --version + +ADD pip-requirements.txt pip-requirements.txt +ADD otfPingTestHead.py otfPingTestHead.py + +RUN mkdir -p /otf/logs + +RUN python -m pip install -r pip-requirements.txt + +ENTRYPOINT ["python", "otfPingTestHead.py"] diff --git a/otf-ping-test-head/Jenkinsfile b/otf-ping-test-head/Jenkinsfile new file mode 100644 index 0000000..8143fcf --- /dev/null +++ b/otf-ping-test-head/Jenkinsfile @@ -0,0 +1,141 @@ +#!/usr/bin/env groovy + + +properties([[$class: 'ParametersDefinitionProperty', parameterDefinitions: [ + [$class: 'hudson.model.StringParameterDefinition', name: 'PHASE', defaultValue: "BUILD"], + [$class: 'hudson.model.StringParameterDefinition', name: 'ENV', defaultValue: "dev"], + [$class: 'hudson.model.StringParameterDefinition', name: 'MECHID', defaultValue: "id_otf_dev"], + [$class: 'hudson.model.StringParameterDefinition', name: 'KUBE_CONFIG', defaultValue: "kubeConfig-dev"], + [$class: 'hudson.model.StringParameterDefinition', name: 'TILLER_NAMESPACE', defaultValue: "org-oran-otf"] +]]]) + + +echo "Build branch: ${env.BRANCH_NAME}" + +node("docker"){ + stage 'Checkout' + checkout scm + PHASES=PHASE.tokenize( '_' ); + echo "PHASES : " + PHASES + + + ARTIFACT_ID="otf-ping-test-head"; + VERSION="Blitzcrank.1.1"; + NAMESPACE="org-oran-otf" + DOCKER_REGISTRY="registry.hub.docker.io" + + if( ENV.equalsIgnoreCase("dev") ){ + IMAGE_NAME=DOCKER_REGISTRY + "/" + NAMESPACE + "/" + ARTIFACT_ID + ":" + VERSION + + } + if( ENV.equalsIgnoreCase("prod") || ENV.equalsIgnoreCase("prod-dr")){ + IMAGE_NAME=DOCKER_REGISTRY + "/" + NAMESPACE + ".prod" + "/" + ARTIFACT_ID + ":" + VERSION + + } + + if( ENV.equalsIgnoreCase("st") ){ + IMAGE_NAME=DOCKER_REGISTRY + "/" + NAMESPACE + ".st" + "/" + ARTIFACT_ID + ":" + VERSION + + } + + echo "Artifact: " + IMAGE_NAME + + withEnv(["PATH=${env.PATH}:${env.WORKSPACE}/linux-amd64", "HELM_HOME=${env.WORKSPACE}"]) { + + echo "PATH=${env.PATH}" + echo "HELM_HOME=${env.HELM_HOME}" + + if (PHASES.contains("BUILD")){ + + stage 'Publish Artifact' + + withCredentials([usernamePassword(credentialsId: MECHID, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) { + + echo "Artifact: " + IMAGE_NAME + + sh """ + docker login $DOCKER_REGISTRY --username $USERNAME --password $PASSWORD + docker build -t $IMAGE_NAME . + docker push $IMAGE_NAME + """ + } + + } + + if (PHASES.contains("DEPLOY") || PHASES.contains("UNDEPLOY")) { + + stage 'Init Helm' + + //check if helm exists if not install + if(fileExists('linux-amd64/helm')){ + sh """ + echo "helm is already installed" + """ + } + else{ + //download helm + sh """ + echo "installing helm" + wget https://storage.googleapis.com/kubernetes-helm/helm-v2.8.2-linux-amd64.tar.gz + tar -xf helm-v2.8.2-linux-amd64.tar.gz + rm helm-v2.8.2-linux-amd64.tar.gz + """ + } + + withCredentials([file(credentialsId: KUBE_CONFIG, variable: 'KUBECONFIG')]) { + + dir('helm'){ + //check if charts are valid, and then perform dry run, if successful then upgrade/install charts + + if (PHASES.contains("UNDEPLOY") ) { + stage 'Undeploy' + + sh """ + helm delete --tiller-namespace=$TILLER_NAMESPACE --purge $ARTIFACT_ID + """ + } + + //NOTE Double quotes are used below to access groovy variables like artifact_id and tiller_namespace + if (PHASES.contains("DEPLOY") ){ + stage 'Deploy' + withCredentials([usernamePassword(credentialsId: MECHID, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) { + + sh """ + echo "Validate Yaml" + helm lint $ARTIFACT_ID + + echo "View Helm Templates" + helm template $ARTIFACT_ID --set appName=$ARTIFACT_ID \ + --set appName=$ARTIFACT_ID \ + --set version=$VERSION \ + --set env=$ENV \ + --set image=$IMAGE_NAME \ + --set namespace=$TILLER_NAMESPACE + + echo "Perform Dry Run Of Install" + helm upgrade --tiller-namespace=$TILLER_NAMESPACE --install --dry-run $ARTIFACT_ID $ARTIFACT_ID \ + --set appName=$ARTIFACT_ID \ + --set version=$VERSION \ + --set env=$ENV \ + --set image=$IMAGE_NAME \ + --set namespace=$TILLER_NAMESPACE + + + echo "Helm Install/Upgrade" + helm upgrade --tiller-namespace=$TILLER_NAMESPACE --install $ARTIFACT_ID $ARTIFACT_ID \ + --set appName=$ARTIFACT_ID \ + --set version=$VERSION \ + --set env=$ENV \ + --set image=$IMAGE_NAME \ + --set namespace=$TILLER_NAMESPACE + + """ + } + } + + } + } + } + + } +} diff --git a/otf-ping-test-head/LICENSE.txt b/otf-ping-test-head/LICENSE.txt new file mode 100644 index 0000000..aa73a11 --- /dev/null +++ b/otf-ping-test-head/LICENSE.txt @@ -0,0 +1,28 @@ +Unless otherwise specified, all software contained herein is licensed +under the Apache License, Version 2.0 (the "Software License"); +you may not use this software except in compliance with the Software +License. You may obtain a copy of the Software License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the Software License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the Software License for the specific language governing permissions +and limitations under the Software License. + + + +Unless otherwise specified, all documentation contained herein is licensed +under the Creative Commons License, Attribution 4.0 Intl. (the +"Documentation License"); you may not use this documentation except in +compliance with the Documentation License. You may obtain a copy of the +Documentation License at + +https://creativecommons.org/licenses/by/4.0/ + +Unless required by applicable law or agreed to in writing, documentation +distributed under the Documentation License is distributed on an "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied. See the Documentation License for the specific language governing +permissions and limitations under the Documentation License. \ No newline at end of file diff --git a/otf-ping-test-head/helm/otf-ping-test-head/.helmignore b/otf-ping-test-head/helm/otf-ping-test-head/.helmignore new file mode 100644 index 0000000..daebc7d --- /dev/null +++ b/otf-ping-test-head/helm/otf-ping-test-head/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/otf-ping-test-head/helm/otf-ping-test-head/Chart.yaml b/otf-ping-test-head/helm/otf-ping-test-head/Chart.yaml new file mode 100644 index 0000000..75d7003 --- /dev/null +++ b/otf-ping-test-head/helm/otf-ping-test-head/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +appVersion: "1.0" +description: A Helm chart for the Ping Server Virtual Test Head +name: otf-ping-test-head +version: 0.0.1 diff --git a/otf-ping-test-head/helm/otf-ping-test-head/templates/deployment.yaml b/otf-ping-test-head/helm/otf-ping-test-head/templates/deployment.yaml new file mode 100644 index 0000000..b6cc154 --- /dev/null +++ b/otf-ping-test-head/helm/otf-ping-test-head/templates/deployment.yaml @@ -0,0 +1,113 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: {{ .Values.appName}} + namespace: {{.Values.namespace}} + labels: + app: {{ .Values.appName}} + version: {{.Values.version}} +spec: + revisionHistoryLimit: 1 + minReadySeconds: 10 + strategy: + # indicate which strategy we want for rolling update + type: RollingUpdate + rollingUpdate: + maxSurge: 0 + maxUnavailable: 1 + replicas: {{ .Values.replicas}} + selector: + matchLabels: + app: {{ .Values.appName}} + version: {{.Values.version}} + template: + metadata: + labels: + app: {{ .Values.appName}} + version: {{.Values.version}} + spec: + serviceAccount: default + volumes: + - name: {{ .Values.appName}}-cert-volume + secret: + secretName: {{.Values.sharedCert}} + optional: true + items: + - key: PEM_CERT + path: otf.pem + - key: PEM_KEY + path: privateKey.pem + {{ if or (eq .Values.env "st") (eq .Values.env "prod-dr")}} + {{else}} + - name: logging-pvc + persistentVolumeClaim: + {{if eq .Values.env "prod"}} + claimName: {{ .Values.pvc.prod | quote }} + {{ else }} + claimName: {{ .Values.pvc.dev | quote }} + {{ end }} + {{end}} + containers: + - name: {{ .Values.appName}} + image: {{ .Values.image}} + imagePullPolicy: Always + ports: + - name: http + containerPort: 5000 + nodePort: {{.Values.nodePort}} + protocol: TCP + {{ if eq .Values.env "st"}} + resources: + limits: + memory: "512Mi" + cpu: "500m" + requests: + memory: "256Mi" + cpu: "100m" + {{else}} + resources: + limits: + memory: "1Gi" + cpu: "1" + requests: + memory: "1Gi" + cpu: "1" + {{end}} + env: + - name: NAMESPACE + value: {{.Values.namespace}} + - name: APP_NAME + value: {{ .Values.appName}} + - name: APP_VERSION + value: {{.Values.version}} + volumeMounts: + - name: {{.Values.appName}}-cert-volume + mountPath: /opt/cert + {{ if or (eq .Values.env "st") (eq .Values.env "prod-dr")}} + {{else}} + - name: logging-pvc + mountPath: "/otf/logs" + {{end}} + livenessProbe: + httpGet: + path: {{.Values.health}} + port: http + scheme: HTTPS + httpHeaders: + - name: X-Custom-Header + value: Alive + initialDelaySeconds: 30 + timeoutSeconds: 30 + periodSeconds: 30 + readinessProbe: + httpGet: + path: {{.Values.health}} + port: http + scheme: HTTPS + httpHeaders: + - name: X-Custom-Header + value: Ready + initialDelaySeconds: 30 + timeoutSeconds: 30 + periodSeconds: 30 + restartPolicy: Always diff --git a/otf-ping-test-head/helm/otf-ping-test-head/templates/service.yaml b/otf-ping-test-head/helm/otf-ping-test-head/templates/service.yaml new file mode 100644 index 0000000..f3bcfab --- /dev/null +++ b/otf-ping-test-head/helm/otf-ping-test-head/templates/service.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.appName }} + namespace: {{ .Values.namespace}} + labels: + app: {{ .Values.appName }} + version: {{ .Values.version}} +spec: + type: NodePort + ports: + - name: http + port: 5000 + protocol: TCP + nodePort: {{ .Values.nodePort}} + selector: + app: {{ .Values.appName }} + version: {{ .Values.version}} diff --git a/otf-ping-test-head/helm/otf-ping-test-head/values.yaml b/otf-ping-test-head/helm/otf-ping-test-head/values.yaml new file mode 100644 index 0000000..bb24ca1 --- /dev/null +++ b/otf-ping-test-head/helm/otf-ping-test-head/values.yaml @@ -0,0 +1,12 @@ +appName: otf-ping-test-head +env: dev +version: 0.0.1-SNAPSHOT +image: otf-ping-test-head:0.0.1-SNAPSHOT +namespace: org-oran-otf +nodePort: 32223 +replicas: 1 +health : /otf/vth/ping/v1/health +sharedCert: otf-cert-secret-builder +pvc: + dev: org-oran-otf-dev-logs-pv + prod: org-oran-otf-prod-logs-pv diff --git a/otf-ping-test-head/opt/cert/certInfo.txt b/otf-ping-test-head/opt/cert/certInfo.txt new file mode 100644 index 0000000..bb8fa5f --- /dev/null +++ b/otf-ping-test-head/opt/cert/certInfo.txt @@ -0,0 +1 @@ +add certs here. requires two pem files (Cert and key) diff --git a/otf-ping-test-head/otfPingTestHead.py b/otf-ping-test-head/otfPingTestHead.py new file mode 100644 index 0000000..1163034 --- /dev/null +++ b/otf-ping-test-head/otfPingTestHead.py @@ -0,0 +1,196 @@ +# Copyright (c) 2019 AT&T Intellectual Property. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +################################################################################ + +from flask import Flask, request, make_response, jsonify, g +import json +import uuid +import traceback +import pyping +import paramiko +import socket +import os +import subprocess +import datetime +import logging +from logging import FileHandler + +#redirect http to https +app = Flask(__name__) + + +# Prevents print statement every time an endpoint is triggered. +logging.getLogger("werkzeug").setLevel(logging.WARNING) + +def unix_time_millis(dt): + epoch = datetime.datetime.utcfromtimestamp(0) + return (dt - epoch).total_seconds() * 1000.0 + +def pingServer(targetHost): + try: + response = subprocess.check_output( + ['ping', '-c', '1', targetHost], # execute the ping command + stderr = subprocess.STDOUT, # retrieve all the output + universal_newlines = True # return as string + ) + except subprocess.CalledProcessError as e: + app.logger.error(e) + app.logger.error('failed getting response from ' + str(targetHost)) + response = None + + return response + +@app.route("/otf/vth/ping/v1/health", methods = ['GET']) +def getHealth(): + return "UP" + +@app.route('/otf/vth/sample/v1', methods = ['POST']) +def sample(): + startTime = unix_time_millis(datetime.datetime.now()) + responseData = { + "vthResponse": { + "testDurationMS": "", + "dateTimeUTC": "", + "abstractMessage": "Success", + "resultData": {} + } + } + responseData['vthResponse']['dateTimeUTC'] = str(datetime.datetime.now()) + endTime = unix_time_millis(datetime.datetime.now()) + responseData['vthResponse']['testDurationMS'] = endTime - startTime + responseData['vthResponse']['resultData']['result'] = "Executed test successfully in " + str(responseData['vthResponse']['testDurationMS']) + " milliseconds." + app.logger.info('hit sample endpoint. response: ' + str(responseData)) + return jsonify(responseData) + +@app.route('/otf/vth/ping/v1', methods = ['POST']) +def testHead(): + responseData = { + "vthResponse": { + "testDurationMS": "", + "dateTimeUTC": "", + "abstractMessage": "", + "resultData": {} + } + } + + responseData['vthResponse']['dateTimeUTC'] = str(datetime.datetime.now()) + startTime = unix_time_millis(datetime.datetime.now()) + + try: + if not request.is_json: + raise ValueError('Request must be a valid JSON object.') + + requestData = request.get_json() + app.logger.info('ping endpoint. request: ' + str(requestData)) + + if 'vthInput' in requestData: + vthInput = requestData['vthInput'] + expectedKeys = ['vthName', 'testConfig', 'testData'] + receivedKeys = vthInput.keys(); + testData = "" + testConfig = "" + + if sorted(expectedKeys) == sorted(receivedKeys): + testData = vthInput['testData'] + + # Check if a target host is provided. + if 'targetHost' not in testData: + raise KeyError('targetHost is required to ping server.') + + # Check if the target host IP address is in the correct format. + # This excludes IPv6. Use IPy to check both IPv6/IPv4. + try: + socket.inet_aton(testData['targetHost']) + except socket.error: + raise ValueError('Invalid IP address assigned to targetHost') + + # Don't use a jump server by default. + if 'useJumpServer' not in testData: + testData['useJumpServer'] = False + else: + raise ValueError('Missing one or more expected keys: {expectedKeys}.'.format(expectedKeys = expectedKeys)) + + if testData['useJumpServer'] == False: + responseData['vthResponse']['resultData']['result'] = pingServer(testData['targetHost']) + else: + testConfig = vthInput['testConfig'] + + if 'jumpServer' not in testConfig: + raise KeyError('Cannot use jump server when jumpServer key is missing.') + + jumpServer = testConfig['jumpServer'] + + if 'host' not in testConfig['jumpServer']: + raise KeyError('Missing host value in jumpServer.') + + host = testConfig['jumpServer']['host'] + + if 'credentials' not in jumpServer: + raise KeyError('Missing credentials in jumpServer.') + + credentials = jumpServer['credentials'] + + if 'username' not in credentials: + raise KeyError('Missing username in credentials.') + + username = credentials['username'] + + if 'password' not in credentials: + raise KeyError('Missing password in credentials.') + + password = credentials['password'] + + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh.connect(host, username = username, password = password) + command = "ping -c 1 " + testData['targetHost'] + ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(command) + output = ssh_stdout.read() + error = ssh_stderr.read() + + responseData['vthResponse']['resultData']['result'] = output + else: + raise KeyError('Missing vthInput parameter(s)') + + # record the end time of the test + endTime = unix_time_millis(datetime.datetime.now()) + + # Calculate the total duration of the test + totalTime = endTime - startTime + + # Set the test duration in the result + responseData['vthResponse']['testDurationMS'] = totalTime + + responseData['vthResponse']['abstractMessage'] = 'Result from pinging {host}'.format(host = testData['targetHost']) + app.logger.info('ping endpoint. response: ' + str(responseData)) + + return jsonify(responseData) + except Exception as e: + app.logger.info(e) + responseData['vthResponse']['abstractMessage'] = str(e) + resp = make_response(json.dumps(responseData)) + endTime = unix_time_millis(datetime.datetime.now()) + + totalTime = endTime - startTime + return resp + +if __name__ == '__main__': + logHandler = FileHandler('otf/logs/pingVTH.log', mode='a') + # logHandler = FileHandler('pingVTH.log', mode='a') + logHandler.setLevel(logging.INFO) + app.logger.setLevel(logging.INFO) + app.logger.addHandler(logHandler) + context = ('opt/cert/otf.pem', 'opt/cert/privateKey.pem') + app.run(debug = False, host = '0.0.0.0', port = 5000, ssl_context = context) + # app.run(debug = False, host = '0.0.0.0', port = 5000) diff --git a/otf-ping-test-head/pip-requirements.txt b/otf-ping-test-head/pip-requirements.txt new file mode 100644 index 0000000..4a744ee --- /dev/null +++ b/otf-ping-test-head/pip-requirements.txt @@ -0,0 +1,6 @@ +flask +flask-cors +pyping +paramiko +FLASK +FLASK-CORS diff --git a/otf-robot-test-head/.gitignore b/otf-robot-test-head/.gitignore new file mode 100644 index 0000000..d5f7c3d --- /dev/null +++ b/otf-robot-test-head/.gitignore @@ -0,0 +1,211 @@ +# Application-specific stuff +files/ +temp/ +opt/cert/*.pem +*.log + +envScript.sh + +# Created by https://www.gitignore.io/api/python,pycharm +# Edit at https://www.gitignore.io/?templates=python,pycharm + +### PyCharm ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### PyCharm Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/sonarlint + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +### Python Patch ### +.venv/ + +# End of https://www.gitignore.io/api/python,pycharm diff --git a/otf-robot-test-head/Dockerfile b/otf-robot-test-head/Dockerfile new file mode 100644 index 0000000..7358b21 --- /dev/null +++ b/otf-robot-test-head/Dockerfile @@ -0,0 +1,18 @@ +FROM python:2.7 + +ARG HTTP_PROXY="http://localhost:8080" +ARG HTTPS_PROXY="http://localhost:8080" +ARG http_proxy="http://localhost:8080" +ARG https_proxy="http://localhost:8080" + +RUN python --version + +ADD pip-requirements.txt pip-requirements.txt +ADD run.py run.py +ADD app app + +RUN python -m pip install -r pip-requirements.txt + +RUN mkdir -p /otf/logs + +ENTRYPOINT ["python", "run.py"] \ No newline at end of file diff --git a/otf-robot-test-head/Jenkinsfile b/otf-robot-test-head/Jenkinsfile new file mode 100644 index 0000000..16fa274 --- /dev/null +++ b/otf-robot-test-head/Jenkinsfile @@ -0,0 +1,150 @@ +#!/usr/bin/env groovy + + +properties([[$class: 'ParametersDefinitionProperty', parameterDefinitions: [ + [$class: 'hudson.model.StringParameterDefinition', name: 'PHASE', defaultValue: "BUILD"], + [$class: 'hudson.model.StringParameterDefinition', name: 'ENV', defaultValue: "dev"], + [$class: 'hudson.model.StringParameterDefinition', name: 'MECHID', defaultValue: "id_otf_dev"], + [$class: 'hudson.model.StringParameterDefinition', name: 'KUBE_CONFIG', defaultValue: "kubeConfig-dev"], + [$class: 'hudson.model.StringParameterDefinition', name: 'OTF_MONGO_DB', defaultValue: "otf_mongo_dev_db"], + [$class: 'hudson.model.StringParameterDefinition', name: 'TILLER_NAMESPACE', defaultValue: "org-oran-otf"] +]]]) + +echo "Build branch: ${env.BRANCH_NAME}" + +node("docker"){ + stage 'Checkout' + checkout scm + PHASES=PHASE.tokenize( '_' ); + echo "PHASES : " + PHASES + + + ARTIFACT_ID="otf-robot-test-head"; + VERSION="Blitzcrank.1.1"; + NAMESPACE="org.oran.otf" + DOCKER_REGISTRY="registry.hub.docker.io" + + if( ENV.equalsIgnoreCase("dev") ){ + IMAGE_NAME=DOCKER_REGISTRY + "/" + NAMESPACE + "/" + ARTIFACT_ID + ":" + VERSION + + } + if( ENV.equalsIgnoreCase("prod") || ENV.equalsIgnoreCase("prod-dr")){ + IMAGE_NAME=DOCKER_REGISTRY + "/" + NAMESPACE + ".prod" + "/" + ARTIFACT_ID + ":" + VERSION + + } + + if( ENV.equalsIgnoreCase("st") ){ + IMAGE_NAME=DOCKER_REGISTRY + "/" + NAMESPACE + ".st" + "/" + ARTIFACT_ID + ":" + VERSION + + } + + echo "Artifact: " + IMAGE_NAME + + withEnv(["PATH=${env.PATH}:${env.WORKSPACE}/linux-amd64", "HELM_HOME=${env.WORKSPACE}"]) { + + echo "PATH=${env.PATH}" + echo "HELM_HOME=${env.HELM_HOME}" + + if (PHASES.contains("BUILD")){ + + stage 'Publish Artifact' + + withCredentials([usernamePassword(credentialsId: MECHID, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) { + + echo "Artifact: " + IMAGE_NAME + + sh """ + docker login $DOCKER_REGISTRY --username $USERNAME --password $PASSWORD + docker build -t $IMAGE_NAME . + docker push $IMAGE_NAME + """ + } + + } + + if (PHASES.contains("DEPLOY") || PHASES.contains("UNDEPLOY")) { + + stage 'Init Helm' + + //check if helm exists if not install + if(fileExists('linux-amd64/helm')){ + sh """ + echo "helm is already installed" + """ + } + else{ + //download helm + sh """ + echo "installing helm" + wget https://storage.googleapis.com/kubernetes-helm/helm-v2.8.2-linux-amd64.tar.gz + tar -xf helm-v2.8.2-linux-amd64.tar.gz + rm helm-v2.8.2-linux-amd64.tar.gz + """ + } + + withCredentials([file(credentialsId: KUBE_CONFIG, variable: 'KUBECONFIG')]) { + + dir('helm'){ + //check if charts are valid, and then perform dry run, if successful then upgrade/install charts + + if (PHASES.contains("UNDEPLOY") ) { + stage 'Undeploy' + + sh """ + helm delete --tiller-namespace=$TILLER_NAMESPACE --purge $ARTIFACT_ID + """ + } + + //NOTE Double quotes are used below to access groovy variables like artifact_id and tiller_namespace + if (PHASES.contains("DEPLOY") ){ + stage 'Deploy' + withCredentials([ + usernamePassword(credentialsId: MECHID, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD'), + usernamePassword(credentialsId: OTF_MONGO_DB, usernameVariable: 'USERNAME_MONGO', passwordVariable: 'PASSWORD_MONGO') + ]) { + + sh """ + echo "Validate Yaml" + helm lint $ARTIFACT_ID + + echo "View Helm Templates" + helm template $ARTIFACT_ID \ + --set appName=$ARTIFACT_ID \ + --set version=$VERSION \ + --set image=$IMAGE_NAME \ + --set namespace=$TILLER_NAMESPACE \ + --set env=$ENV \ + --set mongo.username=$USERNAME_MONGO \ + --set mongo.password=$PASSWORD_MONGO + + echo "Perform Dry Run Of Install" + helm upgrade --tiller-namespace=$TILLER_NAMESPACE --install --dry-run $ARTIFACT_ID $ARTIFACT_ID \ + --set appName=$ARTIFACT_ID \ + --set version=$VERSION \ + --set image=$IMAGE_NAME \ + --set namespace=$TILLER_NAMESPACE \ + --set env=$ENV \ + --set mongo.username=$USERNAME_MONGO \ + --set mongo.password=$PASSWORD_MONGO + + + echo "Helm Install/Upgrade" + helm upgrade --tiller-namespace=$TILLER_NAMESPACE --install $ARTIFACT_ID $ARTIFACT_ID \ + --set appName=$ARTIFACT_ID \ + --set version=$VERSION \ + --set image=$IMAGE_NAME \ + --set namespace=$TILLER_NAMESPACE \ + --set env=$ENV \ + --set mongo.username=$USERNAME_MONGO \ + --set mongo.password=$PASSWORD_MONGO + + """ + } + } + + } + } + } + + } +} diff --git a/otf-robot-test-head/LICENSE.txt b/otf-robot-test-head/LICENSE.txt new file mode 100644 index 0000000..aa73a11 --- /dev/null +++ b/otf-robot-test-head/LICENSE.txt @@ -0,0 +1,28 @@ +Unless otherwise specified, all software contained herein is licensed +under the Apache License, Version 2.0 (the "Software License"); +you may not use this software except in compliance with the Software +License. You may obtain a copy of the Software License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the Software License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the Software License for the specific language governing permissions +and limitations under the Software License. + + + +Unless otherwise specified, all documentation contained herein is licensed +under the Creative Commons License, Attribution 4.0 Intl. (the +"Documentation License"); you may not use this documentation except in +compliance with the Documentation License. You may obtain a copy of the +Documentation License at + +https://creativecommons.org/licenses/by/4.0/ + +Unless required by applicable law or agreed to in writing, documentation +distributed under the Documentation License is distributed on an "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied. See the Documentation License for the specific language governing +permissions and limitations under the Documentation License. \ No newline at end of file diff --git a/otf-robot-test-head/app/__init__.py b/otf-robot-test-head/app/__init__.py new file mode 100644 index 0000000..9fdd41a --- /dev/null +++ b/otf-robot-test-head/app/__init__.py @@ -0,0 +1,36 @@ +""" Copyright (c) 2019 AT&T Intellectual Property. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +#############################################################################""" + + +from flask import Flask +from app.routes import * +from app import database + + +def create_app(): + # create Flask application + app = Flask(__name__) + + # apply configuration + app.config.from_object(os.environ['APP_SETTINGS']) + app.config['g_database'] = None + app.config['g_base_folder'] = os.path.join(os.getcwd(), 'files') + app.config['g_data_folder'] = os.path.join(app.config['g_base_folder'], 'data') + app.config['g_working_folder'] = os.path.join(app.config['g_base_folder'], 'results') + + # register all routes on the APPLICATION_ROOT + app.register_blueprint(routes, url_prefix=app.config['APPLICATION_ROOT']) + + return app diff --git a/otf-robot-test-head/app/configuration.py b/otf-robot-test-head/app/configuration.py new file mode 100644 index 0000000..21cec1f --- /dev/null +++ b/otf-robot-test-head/app/configuration.py @@ -0,0 +1,41 @@ +""" Copyright (c) 2019 AT&T Intellectual Property. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +#############################################################################""" + + +import os + +basedir = os.path.abspath(os.path.dirname(__file__)) + + +class Configuration(object): + DEBUG = False + TESTING = False + CSRF_ENABLED = False + PREFERRED_URL_SCHEME = 'https' + APPLICATION_ROOT = '/otf/vth/robot' + + +class ProductionConfiguration(Configuration): + DEBUG = False + + +class DevelopmentConfiguration(Configuration): + DEVELOPMENT = True + DEBUG = True + + +class TestingConfiguration(Configuration): + DEVELOPMENT = True + DEBUG = True diff --git a/otf-robot-test-head/app/database.py b/otf-robot-test-head/app/database.py new file mode 100644 index 0000000..ea1b433 --- /dev/null +++ b/otf-robot-test-head/app/database.py @@ -0,0 +1,55 @@ +""" Copyright (c) 2019 AT&T Intellectual Property. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +#############################################################################""" + + +import os +from urllib import quote_plus + +from pymongo import MongoClient +from pymongo.errors import ConnectionFailure + + +class DatabaseConfiguration: + def __init__(self): + # read environment variables containing information for the MongoDB replica set. + MONGO_HOST = os.environ['OTF_MONGO_HOSTS'] + MONGO_USERNAME = os.environ['OTF_MONGO_USERNAME'] + MONGO_PASSWORD = os.environ['OTF_MONGO_PASSWORD'] + MONGO_REPLICA_SET = os.environ['OTF_MONGO_REPLICASET'] + MONGO_DATABASE = os.environ['OTF_MONGO_DATABASE'] + + # form the connection string for connection to a MongoDB replica set. + uri = "mongodb://%s:%s@%s?replicaSet=%s" % ( + quote_plus(MONGO_USERNAME), + quote_plus(MONGO_PASSWORD), + MONGO_HOST + MONGO_DATABASE, + MONGO_REPLICA_SET + ) + + client = MongoClient(uri) + + try: + # The ismaster command is cheap and does not require auth. + client.admin.command('ismaster') + print("Established connection to MongoDB.") + self.database = client[MONGO_DATABASE] + except ConnectionFailure: + print("Failed to initialize connection to MongoDB.") + + def set_database(self, database): + self.database = database + + def get_database(self): + return self.database diff --git a/otf-robot-test-head/app/routes/__init__.py b/otf-robot-test-head/app/routes/__init__.py new file mode 100644 index 0000000..67acc1f --- /dev/null +++ b/otf-robot-test-head/app/routes/__init__.py @@ -0,0 +1,22 @@ +""" Copyright (c) 2019 AT&T Intellectual Property. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +#############################################################################""" + + +from flask import Blueprint + +routes = Blueprint('routes', __name__) + +from .health import * +from .robot_processor import * diff --git a/otf-robot-test-head/app/routes/health.py b/otf-robot-test-head/app/routes/health.py new file mode 100644 index 0000000..53bdc22 --- /dev/null +++ b/otf-robot-test-head/app/routes/health.py @@ -0,0 +1,23 @@ +""" Copyright (c) 2019 AT&T Intellectual Property. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +#############################################################################""" + + +from flask import jsonify +from . import routes + + +@routes.route("v1/health", methods=['GET']) +def health(): + return jsonify({'status': 200, 'message': 'UP'}) \ No newline at end of file diff --git a/otf-robot-test-head/app/routes/robot_processor.py b/otf-robot-test-head/app/routes/robot_processor.py new file mode 100644 index 0000000..4444858 --- /dev/null +++ b/otf-robot-test-head/app/routes/robot_processor.py @@ -0,0 +1,164 @@ +""" Copyright (c) 2019 AT&T Intellectual Property. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +#############################################################################""" + + +import shutil +import uuid +import zipfile + +import gridfs +from bson import ObjectId +from flask import request, make_response, jsonify, current_app +from gridfs import NoFile +from robot import run + +from . import routes +from .. import database +from ..utils import * + +db_instance = database.DatabaseConfiguration() + + +def verify_directories(): + # retrieve the app object to retrieve the config we created + app = current_app._get_current_object() + + if not os.path.isdir(app.config['g_base_folder']): + os.makedirs(app.config['g_base_folder']) + if not os.path.isdir(app.config['g_data_folder']): + os.makedirs(app.config['g_data_folder']) + if not os.path.isdir(app.config['g_working_folder']): + os.makedirs(app.config['g_working_folder']) + + +@routes.route("/v1", methods=['POST']) +def robot(): + app = current_app._get_current_object() + + response_data = { + "vthResponse": { + "testDurationMS": "", + "dateTimeUTC": str(datetime.datetime.now()), + "abstractMessage": "", + "resultData": {} + } + } + + start_time = unix_time_millis(datetime.datetime.now()) + + try: + if not request.is_json: + raise ValueError('Invalid JSON object.') + + # get json data from the request + request_data = request.get_json() + + # get values for expected keys + vth_input = try_get_json_value('vthInput', request_data) + test_data = try_get_json_value('testData', vth_input) + robot_file_id = try_get_json_value('robotFileId', test_data) + + # set up a GridFS to access the database + db = db_instance.get_database() + fs = gridfs.GridFS(db) + + # try to find a file using the supplied robot_file_id + compressed_file = fs.get(ObjectId(robot_file_id)) + + # create the directories used during robot processing if they don't exist + verify_directories() + + # generate a folder named by a uuid to organize data for each request + random_uuid = uuid.uuid4().get_hex() + data_dir = os.path.join(app.config['g_data_folder'], random_uuid) + os.mkdir(data_dir) + + # + with open(os.path.join(data_dir, compressed_file.name), 'wb') as f: + f.write(compressed_file.read().__str__()) + f.close() + + with zipfile.ZipFile(os.path.join(data_dir, compressed_file.name)) as zip_ref: + # Create a temporary folder for storing extracted test file(s) + test_dir = os.path.join(app.config['g_working_folder'], random_uuid) + os.mkdir(test_dir) + + # Create a separate folder for the output files, so they can be compressed and sent back to the TCU + test_output_dir = os.path.join(test_dir, 'output') + os.mkdir(test_output_dir) + + # Extract the robot tests into the temporary directory + zip_ref.extractall(test_dir) + + # Run the robot tests with the outputdir pointed to the temporary directory + return_code = run(os.path.join(test_dir), outputdir=os.path.join(test_dir, 'output')) + + # this path is hardcoded so the entire system path isn't included in the zip + path = './files/results/{uuid}/output'.format(uuid=random_uuid) + zip_file = zipfile.ZipFile(path + '.zip', 'w', zipfile.ZIP_DEFLATED, allowZip64=True) + zip_dir(path, zip_file) + zip_file.close() + + # save the results to the database + zf = open(path + '.zip', 'rb') + result_id = fs.put(zf, filename='output.zip', contentType='application/zip') + zf.close() + + response_data['vthResponse']['resultData']['robotStatusCode'] = return_code + response_data['vthResponse']['resultData']['robotResultFileId'] = str(result_id) + response_data['vthResponse']['abstractMessage'] = resolve_robot_status_code(return_code) + + + + # delete data from the local disk + shutil.rmtree(path.replace('/output', '')) + shutil.rmtree(data_dir) + + # record the end time of the test + end_time = unix_time_millis(datetime.datetime.now()) + + # Calculate the total duration of the test + total_time = end_time - start_time + + # Set the test duration in the result + response_data['vthResponse']['testDurationMS'] = total_time + + return jsonify(response_data) + except NoFile as e: + # this exception can only occur if robot_file_id is set to something, so don't worry about reference precedence. + end_time = unix_time_millis(datetime.datetime.now()) + total_time = end_time - start_time + + response_data['vthResponse']['testDurationMS'] = '' + response_data['vthResponse']['abstractMessage'] = \ + 'An exception occurred after running for {totalTime} milliseconds. ' \ + 'A file with _id {id} was not found in the collection.'.format(id=robot_file_id, totalTime=total_time) + + response = make_response(json.dumps(response_data)) + return response + + except Exception as e: + app.logger.error(e) + end_time = unix_time_millis(datetime.datetime.now()) + total_time = end_time - start_time + + response_data['vthResponse']['testDurationMS'] = '' + response_data['vthResponse']['abstractMessage'] = \ + 'An exception occurred after running for {totalTime} milliseconds. ' \ + 'Exception: {exception}.'.format(exception=str(e), totalTime=total_time) + + response = make_response(json.dumps(response_data)) + + return response diff --git a/otf-robot-test-head/app/utils/__init__.py b/otf-robot-test-head/app/utils/__init__.py new file mode 100644 index 0000000..6608a64 --- /dev/null +++ b/otf-robot-test-head/app/utils/__init__.py @@ -0,0 +1,62 @@ +""" Copyright (c) 2019 AT&T Intellectual Property. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +#############################################################################""" + + +import os +import datetime +import json + + +def unix_time_millis(dt): + epoch = datetime.datetime.utcfromtimestamp(0) + return (dt - epoch).total_seconds() * 1000.0 + + +def zip_dir(path, zip_handle): + for root, dirs, files in os.walk(path): + for f in files: + zip_handle.write(os.path.join(root, f)) + + +def try_get_json_value(key, data): + if key not in data: + raise KeyError('The key {key} is not in {data}.' + .format(key=key, data=json.dumps(data))) + + return data[key] + + +def resolve_robot_status_code(code): + resolved_message = 'Invalid robot status code.' + + if code == 0: + resolved_message = 'All critical tests passed.' + elif 0 <= code <= 249: + resolved_message = '{numTestsFailed} test(s) failed.'.format(numTestsFailed=code) + elif code == 250: + resolved_message = '250 or more critical failures.' + elif code == 251: + resolved_message = 'Help or version information printed.' + elif code == 252: + resolved_message = 'Invalid test data or command line options.' + elif code == 253: + resolved_message = 'Test execution stopped by user.' + elif code == 255: + resolved_message = 'Unexpected internal error.' + + return resolved_message + + + diff --git a/otf-robot-test-head/helm/otf-robot-test-head/.helmignore b/otf-robot-test-head/helm/otf-robot-test-head/.helmignore new file mode 100644 index 0000000..daebc7d --- /dev/null +++ b/otf-robot-test-head/helm/otf-robot-test-head/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/otf-robot-test-head/helm/otf-robot-test-head/Chart.yaml b/otf-robot-test-head/helm/otf-robot-test-head/Chart.yaml new file mode 100644 index 0000000..b9f835a --- /dev/null +++ b/otf-robot-test-head/helm/otf-robot-test-head/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +appVersion: "1.0" +description: A Helm chart for the Robot Virtual Test Head +name: otf-robot-test-head +version: 0.0.5-SNAPSHOT diff --git a/otf-robot-test-head/helm/otf-robot-test-head/templates/deployment.yaml b/otf-robot-test-head/helm/otf-robot-test-head/templates/deployment.yaml new file mode 100644 index 0000000..70d6e4c --- /dev/null +++ b/otf-robot-test-head/helm/otf-robot-test-head/templates/deployment.yaml @@ -0,0 +1,151 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: {{ .Values.appName}} + namespace: {{.Values.namespace}} + labels: + app: {{ .Values.appName}} + version: {{.Values.version}} +spec: + revisionHistoryLimit: 1 + minReadySeconds: 10 + strategy: + # indicate which strategy we want for rolling update + type: RollingUpdate + rollingUpdate: + maxSurge: 0 + maxUnavailable: 1 + replicas: {{ .Values.replicas}} + selector: + matchLabels: + app: {{ .Values.appName}} + version: {{.Values.version}} + template: + metadata: + labels: + app: {{ .Values.appName}} + version: {{.Values.version}} + spec: + serviceAccount: default + volumes: + - name: {{ .Values.appName}}-cert-volume + secret: + secretName: {{.Values.sharedCert}} + optional: true + items: + - key: PEM_CERT + path: otf.pem + - key: PEM_KEY + path: privateKey.pem + {{ if or (eq .Values.env "st") (eq .Values.env "prod-dr")}} + {{else}} + - name: logging-pvc + persistentVolumeClaim: + {{if eq .Values.env "prod"}} + claimName: {{ .Values.pvc.prod | quote }} + {{ else }} + claimName: {{ .Values.pvc.dev | quote }} + {{ end }} + {{end}} + containers: + - name: {{ .Values.appName}} + image: {{ .Values.image}} + imagePullPolicy: Always + ports: + - name: http + containerPort: 5000 + nodePort: {{.Values.nodePort}} + protocol: TCP + env: + - name: NAMESPACE + value: {{.Values.namespace}} + - name: APP_NAME + value: {{ .Values.appName}} + - name: APP_VERSION + value: {{.Values.version}} + - name: OTF_MONGO_HOSTS + {{ if or (eq .Values.env "prod") (eq .Values.env "prod-dr")}} + value: {{ .Values.mongo.prod.OTF_MONGO_HOSTS | quote}} + {{ else if eq .Values.env "st" }} + value: {{ .Values.mongo.st.OTF_MONGO_HOSTS | quote}} + {{ else }} + value: {{ .Values.mongo.dev.OTF_MONGO_HOSTS | quote}} + {{ end }} + - name: OTF_MONGO_DATABASE + {{ if or (eq .Values.env "prod") (eq .Values.env "prod-dr")}} + value: {{ .Values.mongo.prod.OTF_MONGO_DBOTF | quote }} + {{ else if eq .Values.env "st" }} + value: {{ .Values.mongo.st.OTF_MONGO_DBOTF | quote }} + {{ else }} + value: {{ .Values.mongo.dev.OTF_MONGO_DBOTF | quote }} + {{ end }} + - name: OTF_MONGO_REPLICASET + {{ if or (eq .Values.env "prod") (eq .Values.env "prod-dr")}} + value: {{ .Values.mongo.prod.OTF_MONGO_REPLICASET | quote }} + {{ else if eq .Values.env "st" }} + value: {{ .Values.mongo.st.OTF_MONGO_REPLICASET | quote }} + {{ else }} + value: {{ .Values.mongo.dev.OTF_MONGO_REPLICASET | quote }} + {{ end }} + - name: OTF_MONGO_USERNAME + valueFrom: + secretKeyRef: + name: {{ .Values.appName}} + key: mongo_username + optional: true + - name: OTF_MONGO_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.appName}} + key: mongo_password + optional: true + - name: APP_SETTINGS + value: {{ .Values.robot.APP_SETTINGS | quote }} + {{ if eq .Values.env "st"}} + resources: + limits: + memory: "2Gi" + cpu: "1" + requests: + memory: "1Gi" + cpu: "500m" + {{else}} + resources: + limits: + memory: "4Gi" + cpu: "2" + requests: + memory: "1Gi" + cpu: "1" + {{end}} + volumeMounts: + - name: {{.Values.appName}}-cert-volume + mountPath: /opt/cert + {{ if or (eq .Values.env "st") (eq .Values.env "prod-dr")}} + {{else}} + - name: logging-pvc + mountPath: "/otf/logs" + {{end}} + livenessProbe: + httpGet: + path: {{.Values.health}} + port: http + scheme: HTTPS + httpHeaders: + - name: X-Custom-Header + value: Alive + initialDelaySeconds: 30 + timeoutSeconds: 30 + periodSeconds: 30 + readinessProbe: + httpGet: + path: {{.Values.health}} + port: http + scheme: HTTPS + httpHeaders: + - name: X-Custom-Header + value: Ready + initialDelaySeconds: 30 + timeoutSeconds: 30 + periodSeconds: 30 + restartPolicy: Always diff --git a/otf-robot-test-head/helm/otf-robot-test-head/templates/secret.yaml b/otf-robot-test-head/helm/otf-robot-test-head/templates/secret.yaml new file mode 100644 index 0000000..ac7c61b --- /dev/null +++ b/otf-robot-test-head/helm/otf-robot-test-head/templates/secret.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Values.appName}} +type: Opaque +data: + mongo_username: {{ .Values.mongo.username | b64enc}} + mongo_password: {{ .Values.mongo.password | b64enc}} diff --git a/otf-robot-test-head/helm/otf-robot-test-head/templates/service.yaml b/otf-robot-test-head/helm/otf-robot-test-head/templates/service.yaml new file mode 100644 index 0000000..f3bcfab --- /dev/null +++ b/otf-robot-test-head/helm/otf-robot-test-head/templates/service.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.appName }} + namespace: {{ .Values.namespace}} + labels: + app: {{ .Values.appName }} + version: {{ .Values.version}} +spec: + type: NodePort + ports: + - name: http + port: 5000 + protocol: TCP + nodePort: {{ .Values.nodePort}} + selector: + app: {{ .Values.appName }} + version: {{ .Values.version}} diff --git a/otf-robot-test-head/helm/otf-robot-test-head/values.yaml b/otf-robot-test-head/helm/otf-robot-test-head/values.yaml new file mode 100644 index 0000000..111d059 --- /dev/null +++ b/otf-robot-test-head/helm/otf-robot-test-head/values.yaml @@ -0,0 +1,31 @@ +appName: otf-robot-test-head +env: dev +version: 0.0.1-SNAPSHOT +image: otf-robot-test-head:0.0.5-SNAPSHOT +namespace: org-oran-otf +nodePort: 32224 +replicas: 1 +health : /otf/vth/robot/v1/health +sharedCert: otf-cert-secret-builder +robot: + APP_SETTINGS: "app.configuration.DevelopmentConfiguration" +pvc: + dev: org-oran-otf-dev-logs-pv + prod: org-oran-otf-prod-logs-pv +mongo: + prod: + OTF_MONGO_HOSTS: "localhost:18720,localhost:18720,localhost:18720/" + OTF_MONGO_DBOTF: "otf" + OTF_MONGO_REPLICASET: "otf-rs-prod2" + dev: + OTF_MONGO_HOSTS: "localhost:27017,localhost:27017,localhost:27017/" + OTF_MONGO_DBOTF: "otf" + OTF_MONGO_REPLICASET: "mongoOTF" + st: + OTF_MONGO_HOSTS: "localhost:27017,localhost:27017,localhost:27017/" + OTF_MONGO_DBOTF: "otf_st" + OTF_MONGO_REPLICASET: "mongoOTF" + + username: "" + password: "" +sharedSecret: otf-aaf-credential-generator diff --git a/otf-robot-test-head/opt/cert/CERT_PLACEHOLDER b/otf-robot-test-head/opt/cert/CERT_PLACEHOLDER new file mode 100644 index 0000000..e69de29 diff --git a/otf-robot-test-head/pip-requirements.txt b/otf-robot-test-head/pip-requirements.txt new file mode 100644 index 0000000..354255b --- /dev/null +++ b/otf-robot-test-head/pip-requirements.txt @@ -0,0 +1,6 @@ +flask +FLASK +pymongo +robotframework +robotframework-selenium2library +selenium \ No newline at end of file diff --git a/otf-robot-test-head/run.py b/otf-robot-test-head/run.py new file mode 100644 index 0000000..c0c37dc --- /dev/null +++ b/otf-robot-test-head/run.py @@ -0,0 +1,14 @@ +from app import create_app + +if __name__ == '__main__': + app = create_app() + + # Set SSL context with the certificate chain and the private RSA key. + context = ('opt/cert/otf.pem', 'opt/cert/privateKey.pem') + app.run( + debug=app.config['DEBUG'], + host='0.0.0.0', port=5000, + use_reloader=True, + ssl_context=context) + # Run without ssl + # app.run(debug=app.config['DEBUG'], host='0.0.0.0', use_reloader=True, port=5000) \ No newline at end of file diff --git a/otf-ssh-test-head/.gitignore b/otf-ssh-test-head/.gitignore new file mode 100644 index 0000000..815f98d --- /dev/null +++ b/otf-ssh-test-head/.gitignore @@ -0,0 +1,5 @@ +otf.pem +privateKey.pem +*.log +*.pem +/otf diff --git a/otf-ssh-test-head/Dockerfile b/otf-ssh-test-head/Dockerfile new file mode 100644 index 0000000..84e31c1 --- /dev/null +++ b/otf-ssh-test-head/Dockerfile @@ -0,0 +1,17 @@ +FROM python:2.7 + +ARG HTTP_PROXY="localhost:8080" +ARG HTTPS_PROXY="localhost:8080" +ARG http_proxy="localhost:8080" +ARG https_proxy="localhost:8080" + +RUN python --version + +ADD pip-requirements.txt pip-requirements.txt +ADD ssh_test_head.py ssh_test_head.py + +RUN mkdir -p /otf/logs + +RUN python -m pip install -r pip-requirements.txt + +ENTRYPOINT ["python", "ssh_test_head.py"] diff --git a/otf-ssh-test-head/Jenkinsfile b/otf-ssh-test-head/Jenkinsfile new file mode 100644 index 0000000..c19179c --- /dev/null +++ b/otf-ssh-test-head/Jenkinsfile @@ -0,0 +1,157 @@ +#!/usr/bin/env groovy + + +properties([[$class: 'ParametersDefinitionProperty', parameterDefinitions: [ + [$class: 'hudson.model.StringParameterDefinition', name: 'PHASE', defaultValue: "BUILD"], + [$class: 'hudson.model.StringParameterDefinition', name: 'ENV', defaultValue: "dev"], + [$class: 'hudson.model.StringParameterDefinition', name: 'MECHID', defaultValue: "id_otf_dev"], + [$class: 'hudson.model.StringParameterDefinition', name: 'KUBE_CONFIG', defaultValue: "kubeConfig-dev"], + [$class: 'hudson.model.StringParameterDefinition', name: 'TILLER_NAMESPACE', defaultValue: "org-oran-otf"] +]]]) + + +echo "Build branch: ${env.BRANCH_NAME}" + +node("docker"){ + stage 'Checkout' + checkout scm + PHASES=PHASE.tokenize( '_' ); + echo "PHASES : " + PHASES + + + ARTIFACT_ID="otf-ssh-test-head"; + VERSION="Blitzcrank.1.1"; + NAMESPACE="org-oran-otf" + DOCKER_REGISTRY="registry.hub.docker.io" + + if( ENV.equalsIgnoreCase("dev") ){ + IMAGE_NAME=DOCKER_REGISTRY + "/" + NAMESPACE + "/" + ARTIFACT_ID + ":" + VERSION + + } + if( ENV.equalsIgnoreCase("prod") || ENV.equalsIgnoreCase("prod-dr")){ + IMAGE_NAME=DOCKER_REGISTRY + "/" + NAMESPACE + ".prod" + "/" + ARTIFACT_ID + ":" + VERSION + + } + + if( ENV.equalsIgnoreCase("st") ){ + IMAGE_NAME=DOCKER_REGISTRY + "/" + NAMESPACE + ".st" + "/" + ARTIFACT_ID + ":" + VERSION + + } + + echo "Artifact: " + IMAGE_NAME + + withEnv(["PATH=${env.PATH}:${env.WORKSPACE}/linux-amd64", "HELM_HOME=${env.WORKSPACE}"]) { + + echo "PATH=${env.PATH}" + echo "HELM_HOME=${env.HELM_HOME}" + + if (PHASES.contains("BUILD")){ + + stage 'Publish Artifact' + + withCredentials([usernamePassword(credentialsId: MECHID, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) { + + echo "Artifact: " + IMAGE_NAME + + sh """ + docker login $DOCKER_REGISTRY --username $USERNAME --password $PASSWORD + docker build -t $IMAGE_NAME . + docker push $IMAGE_NAME + """ + } + + } + + if (PHASES.contains("DEPLOY") || PHASES.contains("UNDEPLOY")) { + + stage 'Init Helm' + + //check if helm exists if not install + if(fileExists('linux-amd64/helm')){ + sh """ + echo "helm is already installed" + """ + } + else{ + //download helm + sh """ + echo "installing helm" + wget https://storage.googleapis.com/kubernetes-helm/helm-v2.8.2-linux-amd64.tar.gz + tar -xf helm-v2.8.2-linux-amd64.tar.gz + rm helm-v2.8.2-linux-amd64.tar.gz + """ + } + + withCredentials([file(credentialsId: KUBE_CONFIG, variable: 'KUBECONFIG')]) { + + dir('helm'){ + //check if charts are valid, and then perform dry run, if successful then upgrade/install charts + + if (PHASES.contains("UNDEPLOY") ) { + stage 'Undeploy' + + sh """ + helm delete --tiller-namespace=$TILLER_NAMESPACE --purge $ARTIFACT_ID + """ + } + + //NOTE Double quotes are used below to access groovy variables like artifact_id and tiller_namespace + if (PHASES.contains("DEPLOY") ){ + stage 'Deploy' + withCredentials([ + usernamePassword(credentialsId: MECHID, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD'), + file(credentialsId: 'id_PRIVATE_KEY', variable: 'VAR_id_PRIVATE_KEY'), + string(credentialsId: 'id_otf_key_passphrase', variable: 'VAR_id_otf_key_passphrase') + ]) { + + sh """ + + cp $VAR_id_PRIVATE_KEY $ARTIFACT_ID + FILE_id_PRIVATE_KEY=`basename $VAR_id_PRIVATE_KEY` + + echo "Validate Yaml" + helm lint $ARTIFACT_ID + + echo "View Helm Templates" + helm template $ARTIFACT_ID --set appName=$ARTIFACT_ID \ + --set appName=$ARTIFACT_ID \ + --set version=$VERSION \ + --set env=$ENV \ + --set image=$IMAGE_NAME \ + --set namespace=$TILLER_NAMESPACE \ + --set Secret.id_private_key=\$FILE_id_PRIVATE_KEY \ + --set Secret.id_private_key_passphrase=$VAR_id_otf_key_passphrase \ + + + + echo "Perform Dry Run Of Install" + helm upgrade --tiller-namespace=$TILLER_NAMESPACE --install --dry-run $ARTIFACT_ID $ARTIFACT_ID \ + --set appName=$ARTIFACT_ID \ + --set version=$VERSION \ + --set env=$ENV \ + --set image=$IMAGE_NAME \ + --set namespace=$TILLER_NAMESPACE \ + --set Secret.id_private_key=\$FILE_id_PRIVATE_KEY \ + --set Secret.id_private_key_passphrase=$VAR_id_otf_key_passphrase \ + + + echo "Helm Install/Upgrade" + helm upgrade --tiller-namespace=$TILLER_NAMESPACE --install $ARTIFACT_ID $ARTIFACT_ID \ + --set appName=$ARTIFACT_ID \ + --set version=$VERSION \ + --set env=$ENV \ + --set image=$IMAGE_NAME \ + --set namespace=$TILLER_NAMESPACE \ + --set Secret.id_private_key=\$FILE_id_PRIVATE_KEY \ + --set Secret.id_private_key_passphrase=$VAR_id_otf_key_passphrase \ + + """ + } + } + + } + } + } + + } +} diff --git a/otf-ssh-test-head/LICENSE.txt b/otf-ssh-test-head/LICENSE.txt new file mode 100644 index 0000000..aa73a11 --- /dev/null +++ b/otf-ssh-test-head/LICENSE.txt @@ -0,0 +1,28 @@ +Unless otherwise specified, all software contained herein is licensed +under the Apache License, Version 2.0 (the "Software License"); +you may not use this software except in compliance with the Software +License. You may obtain a copy of the Software License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the Software License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the Software License for the specific language governing permissions +and limitations under the Software License. + + + +Unless otherwise specified, all documentation contained herein is licensed +under the Creative Commons License, Attribution 4.0 Intl. (the +"Documentation License"); you may not use this documentation except in +compliance with the Documentation License. You may obtain a copy of the +Documentation License at + +https://creativecommons.org/licenses/by/4.0/ + +Unless required by applicable law or agreed to in writing, documentation +distributed under the Documentation License is distributed on an "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied. See the Documentation License for the specific language governing +permissions and limitations under the Documentation License. \ No newline at end of file diff --git a/otf-ssh-test-head/helm/otf-ssh-test-head/.helmignore b/otf-ssh-test-head/helm/otf-ssh-test-head/.helmignore new file mode 100644 index 0000000..daebc7d --- /dev/null +++ b/otf-ssh-test-head/helm/otf-ssh-test-head/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/otf-ssh-test-head/helm/otf-ssh-test-head/Chart.yaml b/otf-ssh-test-head/helm/otf-ssh-test-head/Chart.yaml new file mode 100644 index 0000000..17d1c7b --- /dev/null +++ b/otf-ssh-test-head/helm/otf-ssh-test-head/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +appVersion: "1.0" +description: A Helm chart for the SSH Virtual Test Head +name: otf-ssh-test-head +version: 0.0.1 diff --git a/otf-ssh-test-head/helm/otf-ssh-test-head/templates/deployment.yaml b/otf-ssh-test-head/helm/otf-ssh-test-head/templates/deployment.yaml new file mode 100644 index 0000000..369c4f1 --- /dev/null +++ b/otf-ssh-test-head/helm/otf-ssh-test-head/templates/deployment.yaml @@ -0,0 +1,128 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: {{ .Values.appName}} + namespace: {{.Values.namespace}} + labels: + app: {{ .Values.appName}} + version: {{.Values.version}} +spec: + revisionHistoryLimit: 1 + minReadySeconds: 10 + strategy: + # indicate which strategy we want for rolling update + type: RollingUpdate + rollingUpdate: + maxSurge: 0 + maxUnavailable: 1 + replicas: {{ .Values.replicas}} + selector: + matchLabels: + app: {{ .Values.appName}} + version: {{.Values.version}} + template: + metadata: + labels: + app: {{ .Values.appName}} + version: {{.Values.version}} + spec: + serviceAccount: default + volumes: + - name: {{ .Values.appName}}-cert-volume + secret: + secretName: {{.Values.sharedCert}} + optional: true + items: + - key: PEM_CERT + path: otf.pem + - key: PEM_KEY + path: privateKey.pem + - name: {{ .Values.appName}}-ssh-volume + secret: + secretName: {{.Values.appName}} + optional: true + items: + - key: id_private_key + path: id_otf.key + {{ if or (eq .Values.env "st") (eq .Values.env "prod-dr")}} + {{else}} + - name: logging-pvc + persistentVolumeClaim: + {{if eq .Values.env "prod"}} + claimName: {{ .Values.pvc.prod | quote }} + {{ else }} + claimName: {{ .Values.pvc.dev | quote }} + {{ end }} + {{end}} + containers: + - name: {{ .Values.appName}} + image: {{ .Values.image}} + imagePullPolicy: Always + ports: + - name: http + containerPort: 5000 + nodePort: {{.Values.nodePort}} + protocol: TCP + {{ if eq .Values.env "st"}} + resources: + limits: + memory: "2Gi" + cpu: "1" + requests: + memory: "1Gi" + cpu: "500m" + {{else}} + resources: + limits: + memory: "4Gi" + cpu: "2" + requests: + memory: "1Gi" + cpu: "1" + {{end}} + env: + - name: NAMESPACE + value: {{.Values.namespace}} + - name: APP_NAME + value: {{ .Values.appName}} + - name: APP_VERSION + value: {{.Values.version}} + - name: id_private_key_passphrase + valueFrom: + secretKeyRef: + name: {{ .Values.appName}} + key: id_private_key_passphrase + optional: true + volumeMounts: + - name: {{.Values.appName}}-cert-volume + mountPath: /opt/cert + - name: {{.Values.appName}}-ssh-volume + mountPath: /ssh + {{ if or (eq .Values.env "st") (eq .Values.env "prod-dr")}} + {{else}} + - name: logging-pvc + mountPath: "/otf/logs" + {{end}} + livenessProbe: + httpGet: + path: {{.Values.health}} + port: http + scheme: HTTPS + httpHeaders: + - name: X-Custom-Header + value: Alive + initialDelaySeconds: 30 + timeoutSeconds: 30 + periodSeconds: 30 + readinessProbe: + httpGet: + path: {{.Values.health}} + port: http + scheme: HTTPS + httpHeaders: + - name: X-Custom-Header + value: Ready + initialDelaySeconds: 30 + timeoutSeconds: 30 + periodSeconds: 30 + restartPolicy: Always diff --git a/otf-ssh-test-head/helm/otf-ssh-test-head/templates/secret.yaml b/otf-ssh-test-head/helm/otf-ssh-test-head/templates/secret.yaml new file mode 100644 index 0000000..7a056a9 --- /dev/null +++ b/otf-ssh-test-head/helm/otf-ssh-test-head/templates/secret.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Values.appName}} +type: Opaque +data: + id_private_key: {{ .Files.Get .Values.Secret.id_private_key | b64enc }} + id_private_key_passphrase: {{ .Values.Secret.id_private_key_passphrase | b64enc }} \ No newline at end of file diff --git a/otf-ssh-test-head/helm/otf-ssh-test-head/templates/service.yaml b/otf-ssh-test-head/helm/otf-ssh-test-head/templates/service.yaml new file mode 100644 index 0000000..f3bcfab --- /dev/null +++ b/otf-ssh-test-head/helm/otf-ssh-test-head/templates/service.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.appName }} + namespace: {{ .Values.namespace}} + labels: + app: {{ .Values.appName }} + version: {{ .Values.version}} +spec: + type: NodePort + ports: + - name: http + port: 5000 + protocol: TCP + nodePort: {{ .Values.nodePort}} + selector: + app: {{ .Values.appName }} + version: {{ .Values.version}} diff --git a/otf-ssh-test-head/helm/otf-ssh-test-head/values.yaml b/otf-ssh-test-head/helm/otf-ssh-test-head/values.yaml new file mode 100644 index 0000000..cae8899 --- /dev/null +++ b/otf-ssh-test-head/helm/otf-ssh-test-head/values.yaml @@ -0,0 +1,17 @@ +appName: otf-ssh-test-head +env: dev +version: 0.0.1-SNAPSHOT +image: otf-ssh-test-head:0.0.1-SNAPSHOT +namespace: org-oran-otf +nodePort: 32222 +replicas: 1 +health : /otf/vth/ssh/v1/health +sharedCert: otf-cert-secret-builder +pvc: + dev: org-oran-otf-dev-logs-pv + prod: org-oran-otf-prod-logs-pv + +Secret: + id_private_key: temp + id_private_key_passphrase: temp + diff --git a/otf-ssh-test-head/opt/cert/certInfo.txt b/otf-ssh-test-head/opt/cert/certInfo.txt new file mode 100644 index 0000000..0799b0b --- /dev/null +++ b/otf-ssh-test-head/opt/cert/certInfo.txt @@ -0,0 +1 @@ +add certs here. requires two pem files (Cert and key) diff --git a/otf-ssh-test-head/pip-requirements.txt b/otf-ssh-test-head/pip-requirements.txt new file mode 100644 index 0000000..4a744ee --- /dev/null +++ b/otf-ssh-test-head/pip-requirements.txt @@ -0,0 +1,6 @@ +flask +flask-cors +pyping +paramiko +FLASK +FLASK-CORS diff --git a/otf-ssh-test-head/ssh_test_head.py b/otf-ssh-test-head/ssh_test_head.py new file mode 100644 index 0000000..132bcfc --- /dev/null +++ b/otf-ssh-test-head/ssh_test_head.py @@ -0,0 +1,161 @@ +# Copyright (c) 2019 AT&T Intellectual Property. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +################################################################################ + + +from flask import Flask, request, make_response, jsonify, g +import json +import paramiko +import datetime +import logging +import os +from logging import FileHandler + +# redirect http to https +app = Flask(__name__) + + +# Prevents print statement every time an endpoint is triggered. +logging.getLogger("werkzeug").setLevel(logging.WARNING) + + +def unix_time_millis(dt): + epoch = datetime.datetime.utcfromtimestamp(0) + return (dt - epoch).total_seconds() * 1000.0 + + +@app.route("/otf/vth/ssh/v1/health", methods = ['GET']) +def getHealth(): + return "UP" + + +@app.route('/otf/vth/ssh/v1', methods = ['POST']) +def remoteSSH(): + responseData = { + "vthResponse": { + "testDurationMS": "", + "dateTimeUTC": "", + "abstractMessage": "", + "resultData": {} + } + } + + responseData['vthResponse']['dateTimeUTC'] = str(datetime.datetime.now()) + start_time = unix_time_millis(datetime.datetime.now()) + + try: + if not request.is_json: + raise ValueError('Request must be a valid JSON object.') + + request_data = request.get_json() + + if 'vthInput' in request_data: + vth_input = request_data['vthInput'] + expected_keys = ['vthName', 'testConfig', 'testData'] + received_keys = vth_input.keys(); + test_data = "" + test_config = "" + + if sorted(expected_keys) == sorted(received_keys): + test_data = vth_input['testData'] + + if 'command' not in test_data: + raise ValueError('Must supply value testData.command') + + else: + raise ValueError('Missing one or more expected keys: {expectedKeys}.'.format(expectedKeys=expected_keys)) + + test_config = vth_input['testConfig'] + + if 'jumpServer' not in test_config: + raise KeyError('Cannot use jump server when jumpServer key is missing.') + + jump_server = test_config['jumpServer'] + + if 'host' not in test_config['jumpServer']: + raise KeyError('Missing host value in jumpServer.') + + host = test_config['jumpServer']['host'] + + if 'credentials' not in jump_server: + raise KeyError('Missing credentials in jumpServer.') + + credentials = jump_server['credentials'] + + if 'username' not in credentials: + raise KeyError('Missing username in credentials.') + + username = credentials['username'] + + if 'password' not in credentials: + raise KeyError('Missing password in credentials.') + + password = credentials['password'] + + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + + if 'usePrivateKey' in test_config: + if test_config['usePrivateKey']: + key_passphrase = os.environ.get('id_otf_key_passphrase') + app.logger.info(key_passphrase) + ssh.connect(host, username=username, passphrase='passphrase', key_filename='./ssh/id_otf.key') + with open('./ssh/id_otf.key', 'r') as myfile: + data = myfile.read().replace('\n', '') + + app.logger.info(data) + else: + ssh.connect(host, username=username, password=password) + command = test_data['command'] + ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(command) + + responseData['vthResponse']['resultData']['output'] = str(ssh_stdout.read()).replace('"', '\\"').replace('\n', '\\n') + responseData['vthResponse']['resultData']['error'] = str(ssh_stderr.read()).replace('"', '\\"').replace('\n', '\\n') + + else: + raise KeyError('Missing vthInput parameter(s)') + + # record the end time of the test + endTime = unix_time_millis(datetime.datetime.now()) + + # Calculate the total duration of the test + totalTime = endTime - start_time + + # Set the test duration in the result + responseData['vthResponse']['testDurationMS'] = totalTime + + responseData['vthResponse']['abstractMessage'] = 'done' + + app.logger.info(str(responseData)) + + return jsonify(responseData) + except Exception as e: + app.logger.info(e) + responseData['vthResponse']['abstractMessage'] = str(e) + resp = make_response(json.dumps(responseData)) + endTime = unix_time_millis(datetime.datetime.now()) + + totalTime = endTime - start_time + return resp + + +if __name__ == '__main__': + logHandler = FileHandler('otf/logs/sshVTH.log', mode='a') + # logHandler = FileHandler('sshVTH.log', mode='a') + logHandler.setLevel(logging.INFO) + app.logger.setLevel(logging.INFO) + app.logger.addHandler(logHandler) + context = ('opt/cert/otf.pem', 'opt/cert/privateKey.pem') + app.run(debug = False, host = '0.0.0.0', port = 5000, ssl_context = context) + # app.run(debug = False, host = '0.0.0.0', port=5000) -- 2.16.6

sg_WKER(GrHu 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