environment/metadata.go (333 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT
package environment
import (
"flag"
"log"
"strings"
"github.com/aws/amazon-cloudwatch-agent-test/environment/computetype"
"github.com/aws/amazon-cloudwatch-agent-test/environment/ecsdeploymenttype"
"github.com/aws/amazon-cloudwatch-agent-test/environment/ecslaunchtype"
"github.com/aws/amazon-cloudwatch-agent-test/environment/eksdeploymenttype"
"github.com/aws/amazon-cloudwatch-agent-test/environment/eksinstallationtype"
"github.com/aws/amazon-cloudwatch-agent-test/util/awsservice"
)
const (
DefaultEC2AgentStartCommand = "sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c "
)
var metaDataStorage *MetaData = nil
var registeredMetaDataStrings = &(MetaDataStrings{})
type MetaData struct {
ComputeType computetype.ComputeType
EcsLaunchType ecslaunchtype.ECSLaunchType
EcsDeploymentStrategy ecsdeploymenttype.ECSDeploymentType
EksDeploymentStrategy eksdeploymenttype.EKSDeploymentType
EcsClusterArn string
EcsClusterName string
CwagentConfigSsmParamName string
EcsServiceName string
EC2PluginTests map[string]struct{} // set of EC2 plugin names
ExcludedTests map[string]struct{} // set of excluded names
Bucket string
S3Key string
CwaCommitSha string
CaCertPath string
EKSClusterName string
ProxyUrl string
AssumeRoleArn string
InstanceArn string
InstanceId string
InstancePlatform string
AgentStartCommand string
EksGpuType string
AmpWorkspaceId string
Region string
K8sVersion string
Destroy bool
HelmChartsBranch string
CloudwatchAgentRepository string
CloudwatchAgentTag string
CloudwatchAgentRepositoryURL string
CloudwatchAgentOperatorRepository string
CloudwatchAgentOperatorTag string
CloudwatchAgentOperatorRepositoryURL string
CloudwatchAgentTargetAllocatorRepository string
CloudwatchAgentTargetAllocatorTag string
CloudwatchAgentTargetAllocatorRepositoryURL string
AgentConfig string
PrometheusConfig string
OtelConfig string
SampleApp string
AccountId string
EKSInstallationType eksinstallationtype.EKSInstallationType
}
type MetaDataStrings struct {
ComputeType string
EcsLaunchType string
EcsDeploymentStrategy string
EksDeploymentStrategy string
EcsClusterArn string
CwagentConfigSsmParamName string
EcsServiceName string
EC2PluginTests string // input comma delimited list of plugin names
ExcludedTests string // Exclude specific tests from OS
Bucket string
S3Key string
CwaCommitSha string
CaCertPath string
EKSClusterName string
ProxyUrl string
AssumeRoleArn string
InstanceArn string
InstanceId string
InstancePlatform string
AgentStartCommand string
EksGpuType string
AmpWorkspaceId string
Region string
K8sVersion string
Destroy bool
HelmChartsBranch string
CloudwatchAgentRepository string
CloudwatchAgentTag string
CloudwatchAgentRepositoryURL string
CloudwatchAgentOperatorRepository string
CloudwatchAgentOperatorTag string
CloudwatchAgentOperatorRepositoryURL string
CloudwatchAgentTargetAllocatorRepository string
CloudwatchAgentTargetAllocatorTag string
CloudwatchAgentTargetAllocatorRepositoryURL string
AgentConfig string
PrometheusConfig string
OtelConfig string
SampleApp string
AccountId string
EKSInstallationType string
}
func registerComputeType(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.ComputeType), "computeType", "", "EC2/ECS/EKS")
}
func registerBucket(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.Bucket), "bucket", "", "s3 bucket ex cloudwatch-agent-integration-bucket")
}
func registerS3Key(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.S3Key), "s3key", "release/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm",
"s3 key ex cloudwatch-agent-integration-bucket")
}
func registerCwaCommitSha(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.CwaCommitSha), "cwaCommitSha", "", "agent commit hash ex 0b81ac79ee13f5248b860bbda3afc4ee57f5b8b6")
}
func registerCaCertPath(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.CaCertPath), "caCertPath", "", "ec2 path to crts ex /etc/ssl/certs/ca-certificates.crt")
}
func registerECSData(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.EcsLaunchType), "ecsLaunchType", "", "EC2 or Fargate")
flag.StringVar(&(dataString.EcsDeploymentStrategy), "ecsDeploymentStrategy", "", "Daemon/Replica/Sidecar")
flag.StringVar(&(dataString.EcsClusterArn), "clusterArn", "", "Used to restart ecs task to apply new agent config")
flag.StringVar(&(dataString.CwagentConfigSsmParamName), "cwagentConfigSsmParamName", "", "Used to set new cwa config")
flag.StringVar(&(dataString.EcsServiceName), "cwagentECSServiceName", "", "Used to restart ecs task to apply new agent config")
}
func registerEKSData(d *MetaDataStrings) {
flag.StringVar(&(d.EKSClusterName), "eksClusterName", "", "EKS cluster name")
flag.StringVar(&(d.EksDeploymentStrategy), "eksDeploymentStrategy", "", "Daemon/Replica/Sidecar")
flag.StringVar(&(d.EksGpuType), "eksGpuType", "", "nvidia/inferentia")
}
func registerEKSE2ETestData(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.Region), "region", "", "AWS region")
flag.StringVar(&(dataString.K8sVersion), "k8s_version", "", "Kubernetes version")
flag.BoolVar(&(dataString.Destroy), "destroy", false, "Whether to run in destroy mode (true/false)")
flag.StringVar(&(dataString.HelmChartsBranch), "helm_charts_branch", "", "Helm charts branch")
flag.StringVar(&(dataString.CloudwatchAgentRepository), "cloudwatch_agent_repository", "", "CloudWatch Agent repository")
flag.StringVar(&(dataString.CloudwatchAgentTag), "cloudwatch_agent_tag", "", "CloudWatch Agent tag")
flag.StringVar(&(dataString.CloudwatchAgentRepositoryURL), "cloudwatch_agent_repository_url", "", "CloudWatch Agent repository URL")
flag.StringVar(&(dataString.CloudwatchAgentOperatorRepository), "cloudwatch_agent_operator_repository", "", "CloudWatch Agent Operator repository")
flag.StringVar(&(dataString.CloudwatchAgentOperatorTag), "cloudwatch_agent_operator_tag", "", "CloudWatch Agent Operator tag")
flag.StringVar(&(dataString.CloudwatchAgentOperatorRepositoryURL), "cloudwatch_agent_operator_repository_url", "", "CloudWatch Agent Operator repository URL")
flag.StringVar(&(dataString.CloudwatchAgentTargetAllocatorRepository), "cloudwatch_agent_target_allocator_repository", "", "CloudWatch Agent Target Allocator repository")
flag.StringVar(&(dataString.CloudwatchAgentTargetAllocatorTag), "cloudwatch_agent_target_allocator_tag", "", "CloudWatch Agent Target Allocator tag")
flag.StringVar(&(dataString.CloudwatchAgentTargetAllocatorRepositoryURL), "cloudwatch_agent_target_allocator_repository_url", "", "CloudWatch Agent Target Allocator repository URL")
flag.StringVar(&(dataString.AgentConfig), "agent_config", "", "Agent configuration file path")
flag.StringVar(&(dataString.PrometheusConfig), "prometheus_config", "", "Prometheus configuration file path")
flag.StringVar(&(dataString.OtelConfig), "otel_config", "", "OpenTelemetry configuration file path")
flag.StringVar(&(dataString.SampleApp), "sample_app", "", "Sample application manifest file path")
flag.StringVar(&(dataString.EKSInstallationType), "eks_installation_type", "HELM_CHART", "Installation type (HELM_CHART or EKS_ADDON)")
}
func registerPluginTestsToExecute(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.EC2PluginTests), "plugins", "", "Comma-delimited list of plugins to test. Default is empty, which tests all")
}
func registerExcludedTests(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.ExcludedTests), "excludedTests", "", "Comma-delimited list of test to exclude. Default is empty, which tests all")
}
func registerProxyUrl(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.ProxyUrl), "proxyUrl", "", "Public IP address of a proxy instance. Default is empty with no proxy instance being used")
}
func fillComputeType(e *MetaData, data *MetaDataStrings) {
computeType, ok := computetype.FromString(data.ComputeType)
if !ok {
log.Panic("Invalid compute type. Needs to be EC2/ECS/EKS. Compute Type is a required flag. :" + data.ComputeType)
}
e.ComputeType = computeType
}
func registerAssumeRoleArn(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.AssumeRoleArn), "assumeRoleArn", "", "Arn for assume role to be used")
}
func registerInstanceArn(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.InstanceArn), "instanceArn", "", "ec2 instance ARN that is being used by a test")
}
func registerInstanceId(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.InstanceId), "instanceId", "", "ec2 instance ID that is being used by a test")
}
func registerInstancePlatform(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.InstancePlatform), "instancePlatform", "linux", "ec2 instance OS that is being used for a test")
}
func registerAgentStartCommand(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.AgentStartCommand), "agentStartCommand",
DefaultEC2AgentStartCommand,
"Start command is different ec2 vs onprem, linux vs windows. Default set above is for EC2 with Linux")
}
func fillECSData(e *MetaData, data *MetaDataStrings) {
if e.ComputeType != computetype.ECS {
return
}
ecsLaunchType, ok := ecslaunchtype.FromString(data.EcsLaunchType)
if !ok {
log.Printf("Invalid launch type %s. This might be because it wasn't provided for non-ECS tests", data.ComputeType)
} else {
e.EcsLaunchType = ecsLaunchType
}
ecsDeploymentStrategy, ok := ecsdeploymenttype.FromString(data.EcsDeploymentStrategy)
if !ok {
log.Printf("Invalid deployment strategy %s. This might be because it wasn't provided for non-ECS tests", data.ComputeType)
} else {
e.EcsDeploymentStrategy = ecsDeploymentStrategy
}
e.EcsClusterArn = data.EcsClusterArn
e.CwagentConfigSsmParamName = data.CwagentConfigSsmParamName
e.EcsServiceName = data.EcsServiceName
e.EcsClusterName = awsservice.GetClusterName(data.EcsClusterArn)
}
func fillEC2PluginTests(e *MetaData, data *MetaDataStrings) {
if e.ComputeType != computetype.EC2 {
return
}
if len(data.EC2PluginTests) == 0 {
log.Println("Testing all EC2 plugins")
return
}
plugins := strings.Split(strings.ReplaceAll(data.EC2PluginTests, " ", ""), ",")
log.Printf("Executing subset of plugin tests: %v", plugins)
m := make(map[string]struct{}, len(plugins))
for _, p := range plugins {
m[strings.ToLower(p)] = struct{}{}
}
e.EC2PluginTests = m
}
func fillExcludedTests(e *MetaData, data *MetaDataStrings) {
if e.ComputeType != computetype.EC2 {
return
}
if len(data.ExcludedTests) == 0 {
log.Println("Testing all EC2 plugins")
return
}
plugins := strings.Split(strings.ReplaceAll(data.ExcludedTests, " ", ""), ",")
log.Printf("Excluding subset of tests: %v", plugins)
m := make(map[string]struct{}, len(plugins))
for _, p := range plugins {
m[strings.ToLower(p)] = struct{}{}
}
e.ExcludedTests = m
}
func fillEKSData(e *MetaData, data *MetaDataStrings) {
if e.ComputeType != computetype.EKS {
return
}
eksDeploymentStrategy, ok := eksdeploymenttype.FromString(data.EksDeploymentStrategy)
if !ok {
log.Printf("Invalid deployment strategy %s. This might be because it wasn't provided for non-EKS tests", data.ComputeType)
} else {
e.EksDeploymentStrategy = eksDeploymentStrategy
}
e.EKSClusterName = data.EKSClusterName
e.EksGpuType = data.EksGpuType
}
func fillEKSInstallationType(e *MetaData, data *MetaDataStrings) {
if e.ComputeType != computetype.EKS {
return
}
installationType, ok := eksinstallationtype.FromString(data.EKSInstallationType)
if !ok {
log.Printf("Invalid installation type %s. Defaulting to HELM_CHART", data.EKSInstallationType)
e.EKSInstallationType = eksinstallationtype.HELM_CHART
} else {
e.EKSInstallationType = installationType
}
}
func registerAmpWorkspaceId(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.AmpWorkspaceId), "ampWorkspaceId", "", "workspace Id for Amazon Managed Prometheus (AMP)")
}
func registerAccountId(dataString *MetaDataStrings) {
flag.StringVar(&(dataString.AccountId), "accountId", "", "AWS account Id")
}
func RegisterEnvironmentMetaDataFlags() *MetaDataStrings {
registerComputeType(registeredMetaDataStrings)
registerECSData(registeredMetaDataStrings)
registerEKSData(registeredMetaDataStrings)
registerEKSE2ETestData(registeredMetaDataStrings)
registerBucket(registeredMetaDataStrings)
registerS3Key(registeredMetaDataStrings)
registerCwaCommitSha(registeredMetaDataStrings)
registerCaCertPath(registeredMetaDataStrings)
registerPluginTestsToExecute(registeredMetaDataStrings)
registerExcludedTests(registeredMetaDataStrings)
registerProxyUrl(registeredMetaDataStrings)
registerAssumeRoleArn(registeredMetaDataStrings)
registerInstanceArn(registeredMetaDataStrings)
registerInstanceId(registeredMetaDataStrings)
registerInstancePlatform(registeredMetaDataStrings)
registerAgentStartCommand(registeredMetaDataStrings)
registerAmpWorkspaceId(registeredMetaDataStrings)
registerAccountId(registeredMetaDataStrings)
return registeredMetaDataStrings
}
func GetEnvironmentMetaData() *MetaData {
if metaDataStorage != nil {
return metaDataStorage
}
metaDataStorage := &(MetaData{})
fillComputeType(metaDataStorage, registeredMetaDataStrings)
fillECSData(metaDataStorage, registeredMetaDataStrings)
fillEKSData(metaDataStorage, registeredMetaDataStrings)
fillEC2PluginTests(metaDataStorage, registeredMetaDataStrings)
fillExcludedTests(metaDataStorage, registeredMetaDataStrings)
metaDataStorage.Bucket = registeredMetaDataStrings.Bucket
metaDataStorage.S3Key = registeredMetaDataStrings.S3Key
metaDataStorage.CwaCommitSha = registeredMetaDataStrings.CwaCommitSha
metaDataStorage.CaCertPath = registeredMetaDataStrings.CaCertPath
metaDataStorage.ProxyUrl = registeredMetaDataStrings.ProxyUrl
metaDataStorage.AssumeRoleArn = registeredMetaDataStrings.AssumeRoleArn
metaDataStorage.InstanceArn = registeredMetaDataStrings.InstanceArn
metaDataStorage.InstanceId = registeredMetaDataStrings.InstanceId
metaDataStorage.InstancePlatform = registeredMetaDataStrings.InstancePlatform
metaDataStorage.AgentStartCommand = registeredMetaDataStrings.AgentStartCommand
metaDataStorage.EksGpuType = registeredMetaDataStrings.EksGpuType
metaDataStorage.AmpWorkspaceId = registeredMetaDataStrings.AmpWorkspaceId
metaDataStorage.Region = registeredMetaDataStrings.Region
metaDataStorage.K8sVersion = registeredMetaDataStrings.K8sVersion
metaDataStorage.Destroy = registeredMetaDataStrings.Destroy
metaDataStorage.HelmChartsBranch = registeredMetaDataStrings.HelmChartsBranch
metaDataStorage.CloudwatchAgentRepository = registeredMetaDataStrings.CloudwatchAgentRepository
metaDataStorage.CloudwatchAgentTag = registeredMetaDataStrings.CloudwatchAgentTag
metaDataStorage.CloudwatchAgentRepositoryURL = registeredMetaDataStrings.CloudwatchAgentRepositoryURL
metaDataStorage.CloudwatchAgentOperatorRepository = registeredMetaDataStrings.CloudwatchAgentOperatorRepository
metaDataStorage.CloudwatchAgentOperatorTag = registeredMetaDataStrings.CloudwatchAgentOperatorTag
metaDataStorage.CloudwatchAgentOperatorRepositoryURL = registeredMetaDataStrings.CloudwatchAgentOperatorRepositoryURL
metaDataStorage.CloudwatchAgentTargetAllocatorRepository = registeredMetaDataStrings.CloudwatchAgentTargetAllocatorRepository
metaDataStorage.CloudwatchAgentTargetAllocatorTag = registeredMetaDataStrings.CloudwatchAgentTargetAllocatorTag
metaDataStorage.CloudwatchAgentTargetAllocatorRepositoryURL = registeredMetaDataStrings.CloudwatchAgentTargetAllocatorRepositoryURL
metaDataStorage.AgentConfig = registeredMetaDataStrings.AgentConfig
metaDataStorage.PrometheusConfig = registeredMetaDataStrings.PrometheusConfig
metaDataStorage.OtelConfig = registeredMetaDataStrings.OtelConfig
metaDataStorage.SampleApp = registeredMetaDataStrings.SampleApp
metaDataStorage.AccountId = registeredMetaDataStrings.AccountId
fillEKSInstallationType(metaDataStorage, registeredMetaDataStrings)
return metaDataStorage
}