adding yamo

custom-service-JONYR
rforstner 2021-05-31 19:59:56 +02:00
parent 92244742af
commit 5458cf8183
43 changed files with 1534 additions and 0 deletions

4
yamo/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
test_projects
Test
.env
__pycache__

25
yamo/.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,25 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Aktuelle Datei",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"args": ["-p","projects"]
},
{
"name": "Python: Aktuelle Datei NTTDATA",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"args": ["-i","Test/nttdata","-p","CD_Test", "-r", "container-monitoring-rule", "-e","sadsad"]
}
]
}

2
yamo/.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,2 @@
{
}

63
yamo/Options.py Normal file
View File

@ -0,0 +1,63 @@
class Options:
__instance = None
__project = None
__pathToProjects=None
__env=None
__restCall=None
__loglevel="INFO"
@property
def project(self):
return self.__project
@property
def pathToProjects(self):
return self.__pathToProjects
@property
def env(self):
return self.__env
@property
def restCall(self):
return self.__restCall
@property
def loglevel(self):
return self.__loglevel
@project.setter
def project(self, project):
self.__project=project
@pathToProjects.setter
def pathToProjects(self, pathToProjects):
self.__pathToProjects=pathToProjects
@env.setter
def env(self, env):
self.__env=env
@restCall.setter
def restCall(self, restCall):
self.__restCall=restCall
@loglevel.setter
def loglevel(self, loglevel):
self.__loglevel=loglevel
@staticmethod
def getInstance():
""" Static access method. """
if Options.__instance == None:
Options()
return Options.__instance
def __init__(self):
""" Virtually private constructor. """
if Options.__instance != None:
raise Exception("This class is a singleton!")
else:
Options.__instance = self

62
yamo/Project.py Normal file
View File

@ -0,0 +1,62 @@
from rest.RestCall import RestCall
import time
from yaspin import yaspin
from Report.ReportMessage import ReportMessage, MsgStatus
import coloredlogs, logging
from Options import Options
class Project:
__messages__=[]
__hasErrors__=False
logger = logging.getLogger("yamo")
def getMessages(self):
return __messages__
def hasErrors(self):
return __hasErrors__
def execByRestName(self,restName):
self.logger.debug("Start executing restCall by name "+ restName)
restCall = [x for x in self.restCallList if x.name == restName]
if len(restCall) > 0:
self.exec(restCall[0])
else:
self.logger.warning("Could not find restcall "+ restName)
self.logger.debug("Finished executing restCall by name "+ restName)
def exec(self, restCall):
try:
#sp.text = sp.text+ " > "+restCall.name
#time.sleep(5)
restCall.exec()
#self.logger.info("Project: "+self.name+" Call: "+restCall.name+" [SUCCESS]")
self.__messages__.append(ReportMessage(MsgStatus.SUCCESS, self.name, restCall.name, None, str(e)))
except Exception as e:
self.__hasErrors__= True
#self.logger.error("Project ["+self.name+"] Call: ["+restCall.name+"] --> Failed")
#self.logger.error("Project: "+self.name+" Call: "+restCall.name+" [Failed]")
self.__messages__.append(ReportMessage(MsgStatus.FAILED, self.name, restCall.name, None, str(e))) #['errors'].append(str(e))
def execRestCalls(self):
if Options.getInstance().restCall:
self.execByRestName(Options.getInstance().restCall)
else:
self.execAll()
def execAll(self):
self.logger.debug("Start executing all restcalls..")
for restCall in self.restCallList:
self.exec(restCall)
self.logger.debug("Finished executing all restcalls..")
def __init__(self, name, restCallList):
self.name=name
self.restCallList=restCallList
#self.executionConfig=executionConfig

102
yamo/ProjectList.py Normal file
View File

@ -0,0 +1,102 @@
import os
import sys
import os.path
import json
import yaml
from os import path
from typing import List
from Project import Project
from context.Context import Context
import coloredlogs, logging
from yaspin import yaspin
from Options import Options
class ProjectList:
__projectList=[]
logger = logging.getLogger("yamo")
#def execProject(self, projectName):
#def printReport(self):
# for i in self.__projectList:
# print(i.getErrors())
def getProjectList(self):
return self.__projectList
def execProject(self, projectName):
self.logger.info("Start Processing "+ projectName)
project = [x for x in self.__projectList if x.name == projectName]
if len(project) > 0:
project[0].execRestCalls()
else:
self.logger.warning("Could not find project "+projectName)
self.logger.info("End Processing "+ projectName)
def execAll(self):
for p in self.__projectList:
#with yaspin(text=p.name, color="yellow", side="right") as sp:
self.logger.info("== Start Projet "+ p.name+" ==")
p.execRestCalls()
self.logger.info("== Finished Projet "+ p.name+" ==")
#success = True if p.hasErrors else False
#sp.text = p.name
#if success:
# sp.ok("[SUCCESS] ")
#else:
# sp.fail("[FAILED]")
#if not success
self.logger.debug("Finished Processing ProjectList")
def exec(self):
self.logger.debug("Start Processing ProjectList")
if Options.getInstance().project:
self.execProject(Options.getInstance().project)
else:
self.execAll()
def __buildProjectList(self, projects_root_path):
context = Context.getInstance()
""" READ THE PROJECT PATH """
project_dirs: List[str] = os.listdir(projects_root_path)
for project in project_dirs:
if path.isdir(projects_root_path+"/"+project):
restCalls = []
rest_calls: List[str] = os.listdir(projects_root_path+"/"+project)
if len(rest_calls) == 0:
self.logger.warning("Project: " + project+ " has no configuration")
for restPath in rest_calls:
#execConfig=self.readExecutionConfig(projects_root_path+"/"+project+"/"+restPath+"/"+restPath+".yaml")
restC=context.restFactory.getRest(restPath, projects_root_path+"/"+project)
if restC is None:
self.logger.warning("Project: " + project+ " - RestPath: "+restPath+ " is unknown or missing missing "+ restPath+".yaml file, will be ignored")
if restC:
restCalls.append(restC)
if len(restCalls) > 0:
self.__projectList.append(Project(project,restCalls))
def __init__(self,projects_root_path):
self.__buildProjectList(projects_root_path)
#if len(self.__projectList) < 1:
# print("WARNING: no project folders found in: ", projects_root_path)

View File

@ -0,0 +1,10 @@
from abc import ABC, abstractmethod
class AbstractPrinter(ABC):
def setProjectList(self,projectList):
self.__projectList = projectList
@abstractmethod
def _print(self):
pass

View File

@ -0,0 +1,7 @@
from Report.AbstractPrinter import AbstractPrinter
class ConsolePrinter(AbstractPrinter):
#def test(self):
# pass
def _print(self):
pass

View File

@ -0,0 +1,14 @@
from enum import Enum
class MsgStatus(Enum):
SUCCESS = 1
FAILED = 2
class ReportMessage:
def __init__(self, type, projectName, restCall, environment, msg):
self.__type=type
self.__prjectName=projectName
self.__restCall=restCall
self.__environment=environment
self.__msg=msg

View File

@ -0,0 +1,14 @@
class ReportPrinter:
__reportPrinters=[]
def print(self):
for r in self.__reportPrinters:
r._print()
def append(self, reportPrinter):
reportPrinter.setProjectList(self.__projectList)
self.__reportPrinters.append(reportPrinter)
def __init__(self, projectList):
self.__projectList=projectList

37
yamo/YAMO_onboard.sh Normal file
View File

@ -0,0 +1,37 @@
#!/bin/bash
# Help command
if [ "$1" == "-h" ]; then
echo "Usage: `basename $0` component-name "
exit 0
fi
if [ ! -d "projects/CD_$1/" ]; then
echo "$1 project folder doesn't exist, creating one..."
mkdir projects/CD_$1
else
echo "CD_$1 project folder already exists"
fi
declare -a config_arr=(
"container-monitoring-rule"
#"anotherapiendpoint"
)
for i in "${config_arr[@]}"
do
if [ ! -d "projects/CD_$1/$i" ]; then
echo "--> Creating [$i]"
cp -R templates/project/$i projects/CD_$1/
if [ -f "projects/CD_$1/$i/$i.yaml" ]; then
sed -i "s/#project#/$1/g" projects/CD_$1/$i/$i.yaml
fi
else
echo "[$i] already exist, no changes applied"
fi
done

15
yamo/YAMO_onboard_many.sh Normal file
View File

@ -0,0 +1,15 @@
#!/bin/bash
onboard(){
#read -p "Press enter to continue"
./YAMO_onboard.sh "$i"
}
readarray -t apps < "templates/$1.txt"
for i in "${apps[@]}"
do
# To do - add function [ onboard(), replace-folder(), git-add(), run-monaco() ]
echo $i
onboard
#read -p "Press enter to continue"
done

53
yamo/context/Context.py Normal file
View File

@ -0,0 +1,53 @@
import os
import os.path
import json
import yaml
from os import path
from typing import List
from Project import Project
class Context:
__instance = None
__projectList=[]
__envorinments={}
def envExists(self, env):
if env in self.__environments:
return True
else:
return False
def getAllEnvironments(self):
return self.__environments
def getEnvironment(self, env):
if self.envExists(env):
return self.__environments[env]
else:
raise ValueError('Environment not found: '+ env)
def __buildEnvorinment(self, environmentReader):
self.__environments = environmentReader.read()
def build(self, restFactory, environmentReader):
# self.__buildProjectList(projects_root_path, restFactory)
self.restFactory=restFactory
self.__buildEnvorinment(environmentReader)
@staticmethod
def getInstance():
""" Static access method. """
if Context.__instance == None:
Context()
return Context.__instance
def __init__(self):
""" Virtually private constructor. """
if Context.__instance != None:
raise Exception("This class is a singleton!")
else:
Context.__instance = self

View File

@ -0,0 +1,28 @@
from abc import ABC, abstractmethod
from environment.Environment import Environment
class AbstractEnvReader(ABC):
__environmentList={}
@property
def environments(self):
return self.__environmentList
def printEnvironment(self):
print(self.__environmentList)
def read(self) :
self._readEvnironment()
return self.__environmentList
def _addEnvironment(self, env):
self.__environmentList[env.name]=env
@abstractmethod
def _readEvnironment(self):
pass
def __init__(self, tokenStore):
self.tokenStore=tokenStore

View File

@ -0,0 +1,46 @@
import yaml
class Environment:
@property
def name(self):
return self.__name
@property
def env_url(self):
return self.__env_url
@property
def token(self):
return self.tokenStore.get(self.__token)
@name.setter
def name(self, name):
self.__name=name
@env_url.setter
def env_url(self, env_url):
self.__env_url=env_url
@token.setter
def token(self, token):
self.__token=token
def __init__(self, name, env_url, token):
self.name=name
self.env_url=env_url
self.token=token
def __init__(self, array, tokenStore):
self.tokenStore =tokenStore
for i in array:
for key, value in i.items():
if key == "name":
self.name=i[key]
elif key == "env-url":
self.env_url=i[key]
elif key == "env-token-name":
self.token =i[key]
else:
raise ValueError('Unknown environment config attribute: '+i[key])

View File

@ -0,0 +1,23 @@
from environment.AbstractEnvReader import AbstractEnvReader
from environment.Environment import Environment
import yaml
class YamlEnvReader(AbstractEnvReader):
def _readEvnironment(self):
try:
f = open(self.pathToEnvironmentYAML,)
data=yaml.safe_load(f)
for key, value in data.items():
self._addEnvironment(Environment(value, self.tokenStore))
except:
print("Error while reading environment yaml: ", self.pathToEnvironmentYAML)
raise
def __init__(self, pathToEnvironmentYAML, tokenStore):
self.pathToEnvironmentYAML = pathToEnvironmentYAML
self.tokenStore=tokenStore
#def create_product_b(self) -> AbstractProductB:
# return ConcreteProductB1()

BIN
yamo/projects.zip Normal file

Binary file not shown.

View File

@ -0,0 +1,67 @@
config:
- CDam-casa-PROD: default.json
- CDam-casa-E2E: default.json
- CDam-casa-INT: default.json
- CDam-casa-DEV: default.json
##PROD E2E and PROD (disabled)
CDam-casa-E2E.EMEA-Prod:
- enabled: true
- namespace: "am-casa-e2e"
- skipDeployment: "false"
CDam-casa-PROD.EMEA-Prod:
- enabled: false
- namespace: "am-casa-prod"
- skipDeployment: "true"
CDam-casa-E2E.NA-Prod:
- enabled: true
- namespace: "am-casa-e2e"
- skipDeployment: "false"
CDam-casa-PROD.NA-Prod:
- enabled: false
- namespace: "am-casa-prod"
- skipDeployment: "true"
CDam-casa-E2E.CN-Prod:
- enabled: true
- namespace: "am-casa-e2e"
- skipDeployment: "false"
CDam-casa-PROD.CN-Prod:
- enabled: false
- namespace: "am-casa-prod"
- skipDeployment: "true"
##PREPROD DEV AND INT
CDam-casa-DEV.EMEA-PreProd:
- enabled: true
- namespace: "am-casa-dev"
- skipDeployment: "false"
CDam-casa-INT.EMEA-PreProd:
- enabled: true
- namespace: "am-casa-int"
- skipDeployment: "false"
CDam-casa-DEV.NA-PreProd:
- enabled: true
- namespace: "am-casa-dev"
- skipDeployment: "false"
CDam-casa-INT.NA-PreProd:
- enabled: true
- namespace: "am-casa-int"
- skipDeployment: "false"
CDam-casa-DEV.CN-PreProd:
- enabled: true
- namespace: "am-casa-dev"
- skipDeployment: "false"
CDam-casa-INT.CN-PreProd:
- enabled: true
- namespace: "am-casa-int"
- skipDeployment: "false"

View File

@ -0,0 +1,11 @@
[{
"schemaId": "builtin:container.monitoring-rule",
"scope": "environment",
"value": {
"enabled": "{{.enabled}}",
"mode": "MONITORING_ON",
"property": "KUBERNETES_NAMESPACE",
"value": "{{.namespace}}",
"operator": "EQUALS"
}
}]

View File

@ -0,0 +1,67 @@
config:
- CDam-cnr-PROD: default.json
- CDam-cnr-E2E: default.json
- CDam-cnr-INT: default.json
- CDam-cnr-DEV: default.json
##PROD E2E and PROD (disabled)
CDam-cnr-E2E.EMEA-Prod:
- enabled: true
- namespace: "am-cnr-e2e"
- skipDeployment: "false"
CDam-cnr-PROD.EMEA-Prod:
- enabled: false
- namespace: "am-cnr-prod"
- skipDeployment: "true"
CDam-cnr-E2E.NA-Prod:
- enabled: true
- namespace: "am-cnr-e2e"
- skipDeployment: "false"
CDam-cnr-PROD.NA-Prod:
- enabled: false
- namespace: "am-cnr-prod"
- skipDeployment: "true"
CDam-cnr-E2E.CN-Prod:
- enabled: true
- namespace: "am-cnr-e2e"
- skipDeployment: "false"
CDam-cnr-PROD.CN-Prod:
- enabled: false
- namespace: "am-cnr-prod"
- skipDeployment: "true"
##PREPROD DEV AND INT
CDam-cnr-DEV.EMEA-PreProd:
- enabled: true
- namespace: "am-cnr-dev"
- skipDeployment: "false"
CDam-cnr-INT.EMEA-PreProd:
- enabled: true
- namespace: "am-cnr-int"
- skipDeployment: "false"
CDam-cnr-DEV.NA-PreProd:
- enabled: true
- namespace: "am-cnr-dev"
- skipDeployment: "false"
CDam-cnr-INT.NA-PreProd:
- enabled: true
- namespace: "am-cnr-int"
- skipDeployment: "false"
CDam-cnr-DEV.CN-PreProd:
- enabled: true
- namespace: "am-cnr-dev"
- skipDeployment: "false"
CDam-cnr-INT.CN-PreProd:
- enabled: true
- namespace: "am-cnr-int"
- skipDeployment: "false"

View File

@ -0,0 +1,11 @@
[{
"schemaId": "builtin:container.monitoring-rule",
"scope": "environment",
"value": {
"enabled": "{{.enabled}}",
"mode": "MONITORING_ON",
"property": "KUBERNETES_NAMESPACE",
"value": "{{.namespace}}",
"operator": "EQUALS"
}
}]

View File

@ -0,0 +1,67 @@
config:
- CDam-ecs-PROD: default.json
- CDam-ecs-E2E: default.json
- CDam-ecs-INT: default.json
- CDam-ecs-DEV: default.json
##PROD E2E and PROD (disabled)
CDam-ecs-E2E.EMEA-Prod:
- enabled: true
- namespace: "am-ecs-e2e"
- skipDeployment: "false"
CDam-ecs-PROD.EMEA-Prod:
- enabled: false
- namespace: "am-ecs-prod"
- skipDeployment: "true"
CDam-ecs-E2E.NA-Prod:
- enabled: true
- namespace: "am-ecs-e2e"
- skipDeployment: "false"
CDam-ecs-PROD.NA-Prod:
- enabled: false
- namespace: "am-ecs-prod"
- skipDeployment: "true"
CDam-ecs-E2E.CN-Prod:
- enabled: true
- namespace: "am-ecs-e2e"
- skipDeployment: "false"
CDam-ecs-PROD.CN-Prod:
- enabled: false
- namespace: "am-ecs-prod"
- skipDeployment: "true"
##PREPROD DEV AND INT
CDam-ecs-DEV.EMEA-PreProd:
- enabled: true
- namespace: "am-ecs-dev"
- skipDeployment: "false"
CDam-ecs-INT.EMEA-PreProd:
- enabled: true
- namespace: "am-ecs-int"
- skipDeployment: "false"
CDam-ecs-DEV.NA-PreProd:
- enabled: true
- namespace: "am-ecs-dev"
- skipDeployment: "false"
CDam-ecs-INT.NA-PreProd:
- enabled: true
- namespace: "am-ecs-int"
- skipDeployment: "false"
CDam-ecs-DEV.CN-PreProd:
- enabled: true
- namespace: "am-ecs-dev"
- skipDeployment: "false"
CDam-ecs-INT.CN-PreProd:
- enabled: true
- namespace: "am-ecs-int"
- skipDeployment: "false"

View File

@ -0,0 +1,11 @@
[{
"schemaId": "builtin:container.monitoring-rule",
"scope": "environment",
"value": {
"enabled": "{{.enabled}}",
"mode": "MONITORING_ON",
"property": "KUBERNETES_NAMESPACE",
"value": "{{.namespace}}",
"operator": "EQUALS"
}
}]

View File

@ -0,0 +1,67 @@
config:
- CDam-store-PROD: default.json
- CDam-store-E2E: default.json
- CDam-store-INT: default.json
- CDam-store-DEV: default.json
##PROD E2E and PROD (disabled)
CDam-store-E2E.EMEA-Prod:
- enabled: true
- namespace: "am-store-e2e"
- skipDeployment: "false"
CDam-store-PROD.EMEA-Prod:
- enabled: false
- namespace: "am-store-prod"
- skipDeployment: "true"
CDam-store-E2E.NA-Prod:
- enabled: true
- namespace: "am-store-e2e"
- skipDeployment: "false"
CDam-store-PROD.NA-Prod:
- enabled: false
- namespace: "am-store-prod"
- skipDeployment: "true"
CDam-store-E2E.CN-Prod:
- enabled: true
- namespace: "am-store-e2e"
- skipDeployment: "false"
CDam-store-PROD.CN-Prod:
- enabled: false
- namespace: "am-store-prod"
- skipDeployment: "true"
##PREPROD DEV AND INT
CDam-store-DEV.EMEA-PreProd:
- enabled: true
- namespace: "am-store-dev"
- skipDeployment: "false"
CDam-store-INT.EMEA-PreProd:
- enabled: true
- namespace: "am-store-int"
- skipDeployment: "false"
CDam-store-DEV.NA-PreProd:
- enabled: true
- namespace: "am-store-dev"
- skipDeployment: "false"
CDam-store-INT.NA-PreProd:
- enabled: true
- namespace: "am-store-int"
- skipDeployment: "false"
CDam-store-DEV.CN-PreProd:
- enabled: true
- namespace: "am-store-dev"
- skipDeployment: "false"
CDam-store-INT.CN-PreProd:
- enabled: true
- namespace: "am-store-int"
- skipDeployment: "false"

View File

@ -0,0 +1,11 @@
[{
"schemaId": "builtin:container.monitoring-rule",
"scope": "environment",
"value": {
"enabled": "{{.enabled}}",
"mode": "MONITORING_ON",
"property": "KUBERNETES_NAMESPACE",
"value": "{{.namespace}}",
"operator": "EQUALS"
}
}]

View File

@ -0,0 +1,67 @@
config:
- CDam-usage-PROD: default.json
- CDam-usage-E2E: default.json
- CDam-usage-INT: default.json
- CDam-usage-DEV: default.json
##PROD E2E and PROD (disabled)
CDam-usage-E2E.EMEA-Prod:
- enabled: true
- namespace: "am-usage-e2e"
- skipDeployment: "false"
CDam-usage-PROD.EMEA-Prod:
- enabled: false
- namespace: "am-usage-prod"
- skipDeployment: "true"
CDam-usage-E2E.NA-Prod:
- enabled: true
- namespace: "am-usage-e2e"
- skipDeployment: "false"
CDam-usage-PROD.NA-Prod:
- enabled: false
- namespace: "am-usage-prod"
- skipDeployment: "true"
CDam-usage-E2E.CN-Prod:
- enabled: true
- namespace: "am-usage-e2e"
- skipDeployment: "false"
CDam-usage-PROD.CN-Prod:
- enabled: false
- namespace: "am-usage-prod"
- skipDeployment: "true"
##PREPROD DEV AND INT
CDam-usage-DEV.EMEA-PreProd:
- enabled: true
- namespace: "am-usage-dev"
- skipDeployment: "false"
CDam-usage-INT.EMEA-PreProd:
- enabled: true
- namespace: "am-usage-int"
- skipDeployment: "false"
CDam-usage-DEV.NA-PreProd:
- enabled: true
- namespace: "am-usage-dev"
- skipDeployment: "false"
CDam-usage-INT.NA-PreProd:
- enabled: true
- namespace: "am-usage-int"
- skipDeployment: "false"
CDam-usage-DEV.CN-PreProd:
- enabled: true
- namespace: "am-usage-dev"
- skipDeployment: "false"
CDam-usage-INT.CN-PreProd:
- enabled: true
- namespace: "am-usage-int"
- skipDeployment: "false"

View File

@ -0,0 +1,11 @@
[{
"schemaId": "builtin:container.monitoring-rule",
"scope": "environment",
"value": {
"enabled": "{{.enabled}}",
"mode": "MONITORING_ON",
"property": "KUBERNETES_NAMESPACE",
"value": "{{.namespace}}",
"operator": "EQUALS"
}
}]

View File

@ -0,0 +1,67 @@
config:
- CDam-vas-PROD: default.json
- CDam-vas-E2E: default.json
- CDam-vas-INT: default.json
- CDam-vas-DEV: default.json
##PROD E2E and PROD (disabled)
CDam-vas-E2E.EMEA-Prod:
- enabled: true
- namespace: "am-vas-e2e"
- skipDeployment: "false"
CDam-vas-PROD.EMEA-Prod:
- enabled: false
- namespace: "am-vas-prod"
- skipDeployment: "true"
CDam-vas-E2E.NA-Prod:
- enabled: true
- namespace: "am-vas-e2e"
- skipDeployment: "false"
CDam-vas-PROD.NA-Prod:
- enabled: false
- namespace: "am-vas-prod"
- skipDeployment: "true"
CDam-vas-E2E.CN-Prod:
- enabled: true
- namespace: "am-vas-e2e"
- skipDeployment: "false"
CDam-vas-PROD.CN-Prod:
- enabled: false
- namespace: "am-vas-prod"
- skipDeployment: "true"
##PREPROD DEV AND INT
CDam-vas-DEV.EMEA-PreProd:
- enabled: true
- namespace: "am-vas-dev"
- skipDeployment: "false"
CDam-vas-INT.EMEA-PreProd:
- enabled: true
- namespace: "am-vas-int"
- skipDeployment: "false"
CDam-vas-DEV.NA-PreProd:
- enabled: true
- namespace: "am-vas-dev"
- skipDeployment: "false"
CDam-vas-INT.NA-PreProd:
- enabled: true
- namespace: "am-vas-int"
- skipDeployment: "false"
CDam-vas-DEV.CN-PreProd:
- enabled: true
- namespace: "am-vas-dev"
- skipDeployment: "false"
CDam-vas-INT.CN-PreProd:
- enabled: true
- namespace: "am-vas-int"
- skipDeployment: "false"

View File

@ -0,0 +1,11 @@
[{
"schemaId": "builtin:container.monitoring-rule",
"scope": "environment",
"value": {
"enabled": "{{.enabled}}",
"mode": "MONITORING_ON",
"property": "KUBERNETES_NAMESPACE",
"value": "{{.namespace}}",
"operator": "EQUALS"
}
}]

View File

@ -0,0 +1,67 @@
config:
- CDb2v-com-fe-PROD: default.json
- CDb2v-com-fe-E2E: default.json
- CDb2v-com-fe-INT: default.json
- CDb2v-com-fe-DEV: default.json
##PROD E2E and PROD (disabled)
CDb2v-com-fe-E2E.EMEA-Prod:
- enabled: true
- namespace: "b2v-com-fe-e2e"
- skipDeployment: "false"
CDb2v-com-fe-PROD.EMEA-Prod:
- enabled: false
- namespace: "b2v-com-fe-prod"
- skipDeployment: "true"
CDb2v-com-fe-E2E.NA-Prod:
- enabled: true
- namespace: "b2v-com-fe-e2e"
- skipDeployment: "false"
CDb2v-com-fe-PROD.NA-Prod:
- enabled: false
- namespace: "b2v-com-fe-prod"
- skipDeployment: "true"
CDb2v-com-fe-E2E.CN-Prod:
- enabled: true
- namespace: "b2v-com-fe-e2e"
- skipDeployment: "false"
CDb2v-com-fe-PROD.CN-Prod:
- enabled: false
- namespace: "b2v-com-fe-prod"
- skipDeployment: "true"
##PREPROD DEV AND INT
CDb2v-com-fe-DEV.EMEA-PreProd:
- enabled: true
- namespace: "b2v-com-fe-dev"
- skipDeployment: "false"
CDb2v-com-fe-INT.EMEA-PreProd:
- enabled: true
- namespace: "b2v-com-fe-int"
- skipDeployment: "false"
CDb2v-com-fe-DEV.NA-PreProd:
- enabled: true
- namespace: "b2v-com-fe-dev"
- skipDeployment: "false"
CDb2v-com-fe-INT.NA-PreProd:
- enabled: true
- namespace: "b2v-com-fe-int"
- skipDeployment: "false"
CDb2v-com-fe-DEV.CN-PreProd:
- enabled: true
- namespace: "b2v-com-fe-dev"
- skipDeployment: "false"
CDb2v-com-fe-INT.CN-PreProd:
- enabled: true
- namespace: "b2v-com-fe-int"
- skipDeployment: "false"

View File

@ -0,0 +1,11 @@
[{
"schemaId": "builtin:container.monitoring-rule",
"scope": "environment",
"value": {
"enabled": "{{.enabled}}",
"mode": "MONITORING_ON",
"property": "KUBERNETES_NAMESPACE",
"value": "{{.namespace}}",
"operator": "EQUALS"
}
}]

View File

@ -0,0 +1,67 @@
config:
- CDrsu-adapter-PROD: default.json
- CDrsu-adapter-E2E: default.json
- CDrsu-adapter-INT: default.json
- CDrsu-adapter-DEV: default.json
##PROD E2E and PROD (disabled)
CDrsu-adapter-E2E.EMEA-Prod:
- enabled: true
- namespace: "rsu-adapter-e2e"
- skipDeployment: "false"
CDrsu-adapter-PROD.EMEA-Prod:
- enabled: false
- namespace: "rsu-adapter-prod"
- skipDeployment: "true"
CDrsu-adapter-E2E.NA-Prod:
- enabled: true
- namespace: "rsu-adapter-e2e"
- skipDeployment: "false"
CDrsu-adapter-PROD.NA-Prod:
- enabled: false
- namespace: "rsu-adapter-prod"
- skipDeployment: "true"
CDrsu-adapter-E2E.CN-Prod:
- enabled: true
- namespace: "rsu-adapter-e2e"
- skipDeployment: "false"
CDrsu-adapter-PROD.CN-Prod:
- enabled: false
- namespace: "rsu-adapter-prod"
- skipDeployment: "true"
##PREPROD DEV AND INT
CDrsu-adapter-DEV.EMEA-PreProd:
- enabled: true
- namespace: "rsu-adapter-dev"
- skipDeployment: "false"
CDrsu-adapter-INT.EMEA-PreProd:
- enabled: true
- namespace: "rsu-adapter-int"
- skipDeployment: "false"
CDrsu-adapter-DEV.NA-PreProd:
- enabled: true
- namespace: "rsu-adapter-dev"
- skipDeployment: "false"
CDrsu-adapter-INT.NA-PreProd:
- enabled: true
- namespace: "rsu-adapter-int"
- skipDeployment: "false"
CDrsu-adapter-DEV.CN-PreProd:
- enabled: true
- namespace: "rsu-adapter-dev"
- skipDeployment: "false"
CDrsu-adapter-INT.CN-PreProd:
- enabled: true
- namespace: "rsu-adapter-int"
- skipDeployment: "false"

View File

@ -0,0 +1,11 @@
[{
"schemaId": "builtin:container.monitoring-rule",
"scope": "environment",
"value": {
"enabled": "{{.enabled}}",
"mode": "MONITORING_ON",
"property": "KUBERNETES_NAMESPACE",
"value": "{{.namespace}}",
"operator": "EQUALS"
}
}]

View File

@ -0,0 +1,16 @@
EMEA-PreProd:
- name: "EMEA-PreProd"
- env-url: "https://qqk70169.live.dynatrace.com/"
- env-token-name: "EUPREPROD_TOKEN_VAR"
NA-PreProd:
- name: "NA-PreProd"
- env-url: "https://onb44935.live.dynatrace.com/"
- env-token-name: "NAPREPROD_TOKEN_VAR"
naprod:
- name: "naprod"
- env-url: "https://wgv50241.live.dynatrace.com"
- env-token-name: "NAPROD_TOKEN_VAR"
euprod:
- name: "euprod"
- env-url: "https://xxu26128.live.dynatrace.com"
- env-token-name: "EUPROD_TOKEN_VAR"

92
yamo/rest/RestCall.py Normal file
View File

@ -0,0 +1,92 @@
import json
import re
import requests
import coloredlogs, logging
from Options import Options
class RestCall:
setting={}
logger = logging.getLogger("yamo")
def validate(self):
pass
def skip(self,execConfigValue):
skip=False
for x in execConfigValue:
if 'skipDeployment' in x:
if x['skipDeployment'] == 'true':
skip=True
return skip
def execByEnv(self, env):
self.__exec(env)
def exec(self):
if Options.getInstance().env:
self.execByEnv(Options.getInstance().env)
else:
self.execAll()
def execAll(self):
for env, setting in self.setting.items():
self.__exec(env)
def __exec(self,env):
#print(env)
#context= Context.getInstance()
self.logger.debug("try to execute "+self.name+ " for Evironment "+ env)
variabledBody = self.setting[env]
for vb in variabledBody:
compiledBody = self.__compileBody(vb)
envObj = self.context.getEnvironment(env)
url=envObj.env_url+self.endpoint
headers = {'Content-type': 'application/json', 'Authorization': 'Api-Token '+ envObj.token}
self.logger.debug("Rest body: "+compiledBody)
response = requests.post(url, headers=headers, data=compiledBody)
#self.logger.debug(response.text)
if response.status_code != 200:
self.logger.error(self.name+" Env: "+env+ " [Failed]" )
self.logger.error(response.text )
raise Exception(response.text)
else:
self.logger.info(self.name+" Env: "+env+" [SUCCESS]")
#for key, value in self.setting.items():
# print(key)
#if not self.skip(value):
# print()
#print(value)
#def __getVariable(self,variables,name):
def __compileBody(self, variabledBody):
variables=json.dumps(variabledBody['variables'])
plainBody=json.dumps(variabledBody['body'])
matches = re.findall("\{\{.([a-zA-Z]*)\}\}", plainBody)
for m in matches:
v = re.findall('"'+m+'": ([^}]*)', variables)
plainBody=plainBody.replace('"{{.'+m+'}}"',v[0])
return plainBody
def call(self):
print("Calling rest: "+ self.name)
def __init__(self, name, restConfig, executionConfig,context):
self.name=name
self.endpoint=restConfig["endpoint"]
self.schema=restConfig["schema"]
self.setting=executionConfig
self.context=context
#self.execConfig=execConfig

62
yamo/rest/RestFactory.py Normal file
View File

@ -0,0 +1,62 @@
import json
import yaml
from rest.RestCall import RestCall
from context.Context import Context
import coloredlogs, logging
logger = logging.getLogger(__name__)
class RestFactory:
#def buildRequests(self, name, requestConfig, body):
def __readBodies(self,execConfig, restPath):
bodies={}
for setting in execConfig['config']:
for key, value in setting.items():
body=json.load(open(restPath+"/"+value))
bodies[key]=body
return bodies
def __mapExecutionConfig(self, restName,projectRootPath):
#execConfig=self.readExecutionConfig(projectRootPath+"/"+restName+"/"+restName+".yaml")
mappedExecConfig={}
executionConfigFilePath=projectRootPath+"/"+restName+"/"+restName+".yaml"
executionConfigFile=open(executionConfigFilePath)
execConfig=yaml.safe_load(executionConfigFile)
bodies = self.__readBodies(execConfig,projectRootPath+"/"+restName)
del execConfig['config']
for key, values in execConfig.items():
envSplit = key.split('.')
if len(envSplit) > 1:
if envSplit[1] not in mappedExecConfig:
mappedExecConfig[envSplit[1]]=[]
tmpObj= {}
#tmpBody = bodies[envSplit[0]]
#tmpBody['__yamo__values'] = values
tmpObj['variables']=values
tmpObj['body']=bodies[envSplit[0]]
mappedExecConfig[envSplit[1]].append(tmpObj)
else:
self.logger.warning("Missing Environment config for "+key+" in "+executionConfigFilePath+", will be ignored")
return mappedExecConfig
def getRest(self,restName, projectRootPath):
try:
#execConfig=self.readExecutionConfig(projectRootPath+"/"+name+"/"+name+".yaml")
mappedExecConfig = self.__mapExecutionConfig(restName, projectRootPath)
return RestCall(restName, self.data[restName], mappedExecConfig,Context.getInstance())
except:
return None
def readRestConfig(self, pathToRestConfig):
f = open(pathToRestConfig,)
self.data=json.load(f)
def __init__(self, pathToRestConfig):
self.readRestConfig(pathToRestConfig)

17
yamo/restConfig.json Normal file
View File

@ -0,0 +1,17 @@
{
"container-monitoring-rule": {
"endpoint": "api/v2/settings/objects",
"schema": {
"type": "object",
"properties": {
"price": {
"type": "number"
},
"name": {
"type": "string"
}
}
}
}
}

View File

@ -0,0 +1,8 @@
am-casa
am-usage
am-ecs
am-store
rsu-adapter
b2v-com-fe
am-vas
am-cnr

View File

@ -0,0 +1,67 @@
config:
- CD#project#-PROD: default.json
- CD#project#-E2E: default.json
- CD#project#-INT: default.json
- CD#project#-DEV: default.json
##PROD E2E and PROD (disabled)
CD#project#-E2E.EMEA-Prod:
- enabled: true
- namespace: "#project#-e2e"
- skipDeployment: "false"
CD#project#-PROD.EMEA-Prod:
- enabled: false
- namespace: "#project#-prod"
- skipDeployment: "true"
CD#project#-E2E.NA-Prod:
- enabled: true
- namespace: "#project#-e2e"
- skipDeployment: "false"
CD#project#-PROD.NA-Prod:
- enabled: false
- namespace: "#project#-prod"
- skipDeployment: "true"
CD#project#-E2E.CN-Prod:
- enabled: true
- namespace: "#project#-e2e"
- skipDeployment: "false"
CD#project#-PROD.CN-Prod:
- enabled: false
- namespace: "#project#-prod"
- skipDeployment: "true"
##PREPROD DEV AND INT
CD#project#-DEV.EMEA-PreProd:
- enabled: true
- namespace: "#project#-dev"
- skipDeployment: "false"
CD#project#-INT.EMEA-PreProd:
- enabled: true
- namespace: "#project#-int"
- skipDeployment: "false"
CD#project#-DEV.NA-PreProd:
- enabled: true
- namespace: "#project#-dev"
- skipDeployment: "false"
CD#project#-INT.NA-PreProd:
- enabled: true
- namespace: "#project#-int"
- skipDeployment: "false"
CD#project#-DEV.CN-PreProd:
- enabled: true
- namespace: "#project#-dev"
- skipDeployment: "false"
CD#project#-INT.CN-PreProd:
- enabled: true
- namespace: "#project#-int"
- skipDeployment: "false"

View File

@ -0,0 +1,11 @@
[{
"schemaId": "builtin:container.monitoring-rule",
"scope": "environment",
"value": {
"enabled": "{{.enabled}}",
"mode": "MONITORING_ON",
"property": "KUBERNETES_NAMESPACE",
"value": "{{.namespace}}",
"operator": "EQUALS"
}
}]

View File

@ -0,0 +1,19 @@
from abc import ABC, abstractmethod
class AbstractTokenStore(ABC):
__tokenCache={}
def get(self, tokenName):
if tokenName not in self.__tokenCache:
self.__tokenCache[tokenName] = self._getToken(tokenName)
if self.__tokenCache[tokenName] is None:
print("WARNING: Token: "+tokenName+" could not be resolved!")
return ""
return self.__tokenCache[tokenName]
@abstractmethod
def _getToken(self, name):
pass

View File

@ -0,0 +1,11 @@
import os
from tokenStore.AbstractTokenStore import AbstractTokenStore
from dotenv import load_dotenv
class EnvTokenStore(AbstractTokenStore):
def _getToken(self, name):
return os.getenv(name)
def __init__(self):
load_dotenv()

102
yamo/yamo.py Normal file
View File

@ -0,0 +1,102 @@
from decouple import config
import sys, getopt
#import configBuilder
from context.Context import Context
#from Executer import Executer
from rest.RestFactory import RestFactory
from environment.YamlEnvReader import YamlEnvReader
from ProjectList import ProjectList
from tokenStore.EnvTokenStore import EnvTokenStore
import coloredlogs, logging
from Report.ReportPrinter import ReportPrinter
from Report.ConsolePrinter import ConsolePrinter
from Options import Options
#, ConsolePrinter
def printLogo():
print(r"""
___ ___ ________ _____ ______ ________
|\ \ / /|\ __ \|\ _ \ _ \|\ __ \
\ \ \/ / | \ \|\ \ \ \\\__\ \ \ \ \|\ \
\ \ / / \ \ __ \ \ \\|__| \ \ \ \\\ \
\/ / / \ \ \ \ \ \ \ \ \ \ \ \\\ \
__/ / / \ \__\ \__\ \__\ \ \__\ \_______\
|\___/ / \|__|\|__|\|__| \|__|\|_______|
\|___|/
""")
def printHelp():
printLogo()
print("yamo.py -i <inputProjectsPath> -p <project> -e <environment> -r <restcall>")
def main(argv):
options=Options.getInstance()
pathToProjects = '.'
try:
opts, args = getopt.getopt(argv,"h:i:p:e:r:l:v",["help","iPath","project", "environment", "restcall","logLevel"])
except getopt.GetoptError:
printHelp()
sys.exit(2)
for opt, arg in opts:
if opt in ('-h',"--help"):
printHelp
sys.exit()
elif opt in ("-i", "--iPath"):
options.pathToProjects = arg
elif opt in ("-p", "--project"):
options.project=arg
elif opt in ("-e", "--environment"):
options.env=arg
elif opt in ("-r", "--restcall"):
options.restCall=arg
elif opt in ("-l", "--logLevel"):
options.loglevel=arg
try:
printLogo()
logger = logging.getLogger(__name__)
coloredlogs.install(level=options.loglevel)
#logger.debug("this is a debugging message")
tokenStore=EnvTokenStore()
#print(tokenStoreX.get('NTTDATA-Api-Token'))
pathToRestConfig="restConfig.json"
restFactory = RestFactory(pathToRestConfig)
pathToEnvironmentFile=options.pathToProjects+"/environment.yaml"
envReader = YamlEnvReader(pathToEnvironmentFile, tokenStore)
context = Context.getInstance()
context.build(restFactory,envReader)
pList=ProjectList(options.pathToProjects)
pList.exec()
#if options.project:
# pList.execProject(options.project)
#else:
# pList.execAll()
#rp = ReportPrinter(pList)
#rp.append(ConsolePrinter())
#rp.print()
except:
raise
# print("Exception occured during yammo processing: ", sys.exc_info()[1])
if __name__ == "__main__":
main(sys.argv[1:])