diff --git a/api/agent.go b/api/agent.go index e90b90217..b0526f15c 100644 --- a/api/agent.go +++ b/api/agent.go @@ -494,8 +494,9 @@ func getUserCredentials(usersFilePath string, _ *loadtest.Config) ([]user, error password := split[1] // Quick and dirty hack to extract username from email. // This is not terribly important to be correct. - username := strings.Split(email, "@")[0] - username = strings.Replace(username, "+", "-", -1) + // username := strings.Split(email, "@")[0] + // username = strings.Replace(username, "+", "-", -1) + username := email authService := userentity.AuthenticationTypeMattermost // Check if the user has a custom authentication type. Custom authentication types are diff --git a/cmd/ltctl/collect.go b/cmd/ltctl/collect.go index cc08ef091..c2fd2bd8f 100644 --- a/cmd/ltctl/collect.go +++ b/cmd/ltctl/collect.go @@ -113,7 +113,7 @@ func saveCollection(namePrefix string, files []file) error { return nil } -func createClients(output *terraform.Output) (map[string]*ssh.Client, error) { +func createClients(config deployment.Config, output *terraform.Output) (map[string]*ssh.Client, error) { extAgent, err := ssh.NewAgent() if err != nil { return nil, err @@ -122,26 +122,26 @@ func createClients(output *terraform.Output) (map[string]*ssh.Client, error) { clients := make(map[string]*ssh.Client) if output.HasProxy() { for i, inst := range output.Proxies { - sshc, err := extAgent.NewClient(inst.PrivateIP) + sshc, err := extAgent.NewClient(inst.PrivateIP, config.AWSAMIUser) if err != nil { - return nil, fmt.Errorf("error in getting ssh connection %w", err) + return nil, fmt.Errorf("error in getting ssh connection for %s: %w", inst.Tags.Name, err) } clients[fmt.Sprintf("proxy%d", i)] = sshc } } for i, instance := range output.Instances { - sshc, err := extAgent.NewClient(instance.PrivateIP) + sshc, err := extAgent.NewClient(instance.PrivateIP, config.AWSAMIUser) if err != nil { - return nil, fmt.Errorf("error in getting ssh connection %w", err) + return nil, fmt.Errorf("error in getting ssh connection for %s: %w", instance.Tags.Name, err) } clients[fmt.Sprintf("app%d", i)] = sshc } for i, agent := range output.Agents { - sshc, err := extAgent.NewClient(agent.PrivateIP) + sshc, err := extAgent.NewClient(agent.PrivateIP, config.AWSAMIUser) if err != nil { - return nil, fmt.Errorf("error in getting ssh connection %w", err) + return nil, fmt.Errorf("error in getting ssh connection for %s: %w", agent.Tags.Name, err) } clients[fmt.Sprintf("agent%d", i)] = sshc if i == 0 { @@ -176,7 +176,7 @@ func collect(config deployment.Config, deploymentId string, outputName string) e return err } - clients, err := createClients(output) + clients, err := createClients(config, output) if err != nil { return err } @@ -228,13 +228,13 @@ func collect(config deployment.Config, deploymentId string, outputName string) e return sanitizedCfg, nil }) case strings.HasPrefix(instance, "agent"): - addFile(instance, "/home/ubuntu/mattermost-load-test-ng/ltagent.log", true, nil) + addFile(instance, fmt.Sprintf("/home/%s/mattermost-load-test-ng/ltagent.log", t.Config().AWSAMIUser), true, nil) case instance == "coordinator": - addFile(instance, "/home/ubuntu/mattermost-load-test-ng/ltcoordinator.log", true, nil) - addFile(instance, "/home/ubuntu/mattermost-load-test-ng/config/config.json", false, nil) - addFile(instance, "/home/ubuntu/mattermost-load-test-ng/config/coordinator.json", false, nil) - addFile(instance, "/home/ubuntu/mattermost-load-test-ng/config/simplecontroller.json", false, nil) - addFile(instance, "/home/ubuntu/mattermost-load-test-ng/config/simulcontroller.json", false, nil) + addFile(instance, fmt.Sprintf("/home/%s/mattermost-load-test-ng/ltcoordinator.log", t.Config().AWSAMIUser), true, nil) + addFile(instance, fmt.Sprintf("/home/%s/mattermost-load-test-ng/config/config.json", t.Config().AWSAMIUser), false, nil) + addFile(instance, fmt.Sprintf("/home/%s/mattermost-load-test-ng/config/coordinator.json", t.Config().AWSAMIUser), false, nil) + addFile(instance, fmt.Sprintf("/home/%s/mattermost-load-test-ng/config/simplecontroller.json", t.Config().AWSAMIUser), false, nil) + addFile(instance, fmt.Sprintf("/home/%s/mattermost-load-test-ng/config/simulcontroller.json", t.Config().AWSAMIUser), false, nil) continue } addCmd(instance, "sudo dmesg", "dmesg.out", false, nil) diff --git a/cmd/ltctl/reset.go b/cmd/ltctl/reset.go index 7c392f4e7..cdd2bde0c 100644 --- a/cmd/ltctl/reset.go +++ b/cmd/ltctl/reset.go @@ -47,7 +47,7 @@ func RunResetCmdF(cmd *cobra.Command, args []string) error { appClients := make([]*ssh.Client, len(output.Instances)) for i, instance := range output.Instances { // BRANCH: Using private ip - client, err := extAgent.NewClient(instance.PrivateIP) + client, err := extAgent.NewClient(instance.PrivateIP, t.Config().AWSAMIUser) if err != nil { return fmt.Errorf("error in getting ssh connection %w", err) } @@ -56,7 +56,7 @@ func RunResetCmdF(cmd *cobra.Command, args []string) error { } // BRANCH: Private IP - agentClient, err := extAgent.NewClient(output.Agents[0].PrivateIP) + agentClient, err := extAgent.NewClient(output.Agents[0].PrivateIP, t.Config().AWSAMIUser) if err != nil { return fmt.Errorf("error in getting ssh connection %w", err) } diff --git a/comparison/deployment.go b/comparison/deployment.go index 096c95fda..6b9aa861f 100644 --- a/comparison/deployment.go +++ b/comparison/deployment.go @@ -62,7 +62,7 @@ func provisionFiles(t *terraform.Terraform, dpConfig *deploymentConfig, baseBuil } clients := make([]*ssh.Client, len(output.Instances)) for i, instance := range output.Instances { - client, err := extAgent.NewClient(instance.PrivateIP) + client, err := extAgent.NewClient(instance.PrivateIP, t.Config().AWSAMIUser) if err != nil { return fmt.Errorf("error in getting ssh connection %w", err) } diff --git a/comparison/loadtest.go b/comparison/loadtest.go index 7621c3a41..d848bee0e 100644 --- a/comparison/loadtest.go +++ b/comparison/loadtest.go @@ -178,7 +178,7 @@ func initLoadTest(t *terraform.Terraform, buildCfg BuildConfig, dumpFilename str return err } - agentClient, err := extAgent.NewClient(tfOutput.Agents[0].PrivateIP) + agentClient, err := extAgent.NewClient(tfOutput.Agents[0].PrivateIP, t.Config().AWSAMIUser) if err != nil { return fmt.Errorf("error in getting ssh connection %w", err) } @@ -186,7 +186,7 @@ func initLoadTest(t *terraform.Terraform, buildCfg BuildConfig, dumpFilename str appClients := make([]*ssh.Client, len(tfOutput.Instances)) for i, instance := range tfOutput.Instances { - client, err := extAgent.NewClient(instance.PrivateIP) + client, err := extAgent.NewClient(instance.PrivateIP, t.Config().AWSAMIUser) if err != nil { return fmt.Errorf("error in getting ssh connection %w", err) } @@ -203,7 +203,7 @@ func initLoadTest(t *terraform.Terraform, buildCfg BuildConfig, dumpFilename str buildFileName := filepath.Base(buildCfg.URL) installCmd := deployment.Cmd{ Msg: "Installing app", - Value: fmt.Sprintf("cd /home/ubuntu && tar xzf %s && cp /opt/mattermost/config/config.json . && sudo rm -rf /opt/mattermost && sudo mv mattermost /opt/ && mv config.json /opt/mattermost/config/", buildFileName), + Value: fmt.Sprintf("cd ~ && tar xzf %s && cp /opt/mattermost/config/config.json . && sudo rm -rf /opt/mattermost && sudo mv mattermost /opt/ && mv config.json /opt/mattermost/config/", buildFileName), Clients: appClients, } diff --git a/coordinator/performance/monitor.go b/coordinator/performance/monitor.go index 5b41d0a59..3667e12a2 100644 --- a/coordinator/performance/monitor.go +++ b/coordinator/performance/monitor.go @@ -47,6 +47,9 @@ func NewMonitor(config MonitorConfig, log *mlog.Logger) (*Monitor, error) { // Run will start the performance monitoring process. func (m *Monitor) Run() <-chan Status { go func() { + ticker := time.NewTicker(time.Duration(m.config.UpdateIntervalMs) * time.Millisecond) + defer ticker.Stop() + m.log.Info("monitor: started") for { m.statusChan <- m.runQueries() @@ -54,7 +57,7 @@ func (m *Monitor) Run() <-chan Status { case <-m.stopChan: m.log.Info("monitor: shutting down") return - case <-time.After(time.Duration(m.config.UpdateIntervalMs) * time.Millisecond): + case <-ticker.C: } } }() diff --git a/deployment/config.go b/deployment/config.go index ed6fdd70e..d919b586c 100644 --- a/deployment/config.go +++ b/deployment/config.go @@ -31,6 +31,8 @@ type Config struct { AWSAvailabilityZone string `default:"us-east-1c"` // AWSAMI is the AMI to use for all EC2 instances. AWSAMI string `default:"ami-0fa37863afb290840"` + // AWSAMIUser is the user to use when connecting to the AMI. + AWSAMIUser string `default:"ec2-user"` // ClusterName is the name of the cluster. ClusterName string `default:"loadtest" validate:"alpha"` // ClusterVpcID is the id of the VPC associated to the resources. diff --git a/deployment/opensearch/roundtripper_test.go b/deployment/opensearch/roundtripper_test.go index b62fc2963..0083a548c 100644 --- a/deployment/opensearch/roundtripper_test.go +++ b/deployment/opensearch/roundtripper_test.go @@ -101,7 +101,7 @@ func setupSSHClient(t *testing.T) *ltssh.Client { // Wait for the SSH server to start var sshc *ltssh.Client require.Eventually(t, func() bool { - sshc, err = extAgent.NewClientWithPort(sshIP, sshPort) + sshc, err = extAgent.NewClientWithPort(sshIP, sshPort, "ubuntu") return err == nil }, 5*time.Second, 100*time.Millisecond) diff --git a/deployment/terraform/agent.go b/deployment/terraform/agent.go index 7489eb719..e0948a530 100644 --- a/deployment/terraform/agent.go +++ b/deployment/terraform/agent.go @@ -18,7 +18,7 @@ import ( "github.com/mattermost/mattermost/server/public/shared/mlog" ) -const dstUsersFilePath = "/home/ubuntu/users.txt" +const dstUsersFilePath = "/home/%s/users.txt" func (t *Terraform) generateLoadtestAgentConfig() (*loadtest.Config, error) { cfg, err := loadtest.ReadConfig("") @@ -39,7 +39,7 @@ func (t *Terraform) generateLoadtestAgentConfig() (*loadtest.Config, error) { cfg.ConnectionConfiguration.AdminPassword = t.config.AdminPassword if t.config.UsersFilePath != "" { - cfg.UsersConfiguration.UsersFilePath = dstUsersFilePath + cfg.UsersConfiguration.UsersFilePath = fmt.Sprintf(dstUsersFilePath, t.Config().AWSAMIUser) } return cfg, nil @@ -103,15 +103,16 @@ func (t *Terraform) configureAndRunAgents(extAgent *ssh.ExtAgent) error { go func() { defer wg.Done() - sshc, err := extAgent.NewClient(instance.PrivateIP) + sshc, err := extAgent.NewClient(instance.PrivateIP, t.Config().AWSAMIUser) if err != nil { mlog.Error("error creating ssh client", mlog.Err(err), mlog.Int("agent", agentNumber)) foundErr.Store(true) return } + mlog.Info("Configuring agent", mlog.String("ip", instance.PrivateIP), mlog.Int("agent", agentNumber)) if uploadBinary { - dstFilePath := "/home/ubuntu/tmp.tar.gz" + dstFilePath := fmt.Sprintf("/home/%s/tmp.tar.gz", t.Config().AWSAMIUser) mlog.Info("Uploading binary", mlog.String("file", packagePath), mlog.Int("agent", agentNumber)) if out, err := sshc.UploadFile(packagePath, dstFilePath, false); err != nil { mlog.Error("error uploading file", mlog.String("path", packagePath), mlog.String("output", string(out)), mlog.Err(err), mlog.Int("agent", agentNumber)) @@ -136,10 +137,11 @@ func (t *Terraform) configureAndRunAgents(extAgent *ssh.ExtAgent) error { tplVars := map[string]any{ "blockProfileRate": t.config.PyroscopeSettings.BlockProfileRate, - "execStart": baseAPIServerCmd, + "execStart": fmt.Sprintf(baseAPIServerCmd, t.Config().AWSAMIUser), + "User": t.Config().AWSAMIUser, } if t.config.EnableAgentFullLogs { - tplVars["execStart"] = fmt.Sprintf("/bin/bash -c '%s &>> /home/ubuntu/ltapi.log'", baseAPIServerCmd) + tplVars["execStart"] = fmt.Sprintf("/bin/bash -c '%s &>> /home/%s/ltapi.log'", fmt.Sprintf(baseAPIServerCmd, t.Config().AWSAMIUser), t.Config().AWSAMIUser) } buf := bytes.NewBufferString("") tpl.Execute(buf, tplVars) @@ -151,16 +153,25 @@ func (t *Terraform) configureAndRunAgents(extAgent *ssh.ExtAgent) error { return } + otelcolConfigFile, err := fillConfigTemplate(otelcolConfig, map[string]any{ + "User": t.Config().AWSAMIUser, + }) + if err != nil { + mlog.Error("unable to render otelcol config", mlog.Int("agent", agentNumber), mlog.Err(err)) + foundErr.Store(true) + return + } + batch := []uploadInfo{ {srcData: strings.TrimPrefix(buf.String(), "\n"), dstPath: "/lib/systemd/system/ltapi.service", msg: "Uploading load-test api service file"}, {srcData: strings.TrimPrefix(clientSysctlConfig, "\n"), dstPath: "/etc/sysctl.conf"}, {srcData: strings.TrimPrefix(limitsConfig, "\n"), dstPath: "/etc/security/limits.conf"}, {srcData: strings.TrimPrefix(prometheusNodeExporterConfig, "\n"), dstPath: "/etc/default/prometheus-node-exporter"}, - {srcData: strings.TrimSpace(otelcolConfig), dstPath: "/etc/otelcol-contrib/config.yaml"}, + {srcData: strings.TrimSpace(otelcolConfigFile), dstPath: "/etc/otelcol-contrib/config.yaml"}, } if t.config.UsersFilePath != "" { - batch = append(batch, uploadInfo{srcData: strings.Join(splitFiles[agentNumber], "\n"), dstPath: dstUsersFilePath, msg: "Uploading list of users credentials"}) + batch = append(batch, uploadInfo{srcData: strings.Join(splitFiles[agentNumber], "\n"), dstPath: fmt.Sprintf(dstUsersFilePath, t.Config().AWSAMIUser), msg: "Uploading list of users credentials"}) } // If SiteURL is set, update /etc/hosts to point to the correct IP @@ -181,6 +192,10 @@ func (t *Terraform) configureAndRunAgents(extAgent *ssh.ExtAgent) error { return } + if err := t.setupPrometheusNodeExporter(sshc); err != nil { + mlog.Error("error setting up prometheus node exporter", mlog.Err(err), mlog.Int("agent", agentNumber)) + } + cmd = "sudo systemctl restart otelcol-contrib" if out, err := sshc.RunCommand(cmd); err != nil { mlog.Error("error running ssh command", mlog.Int("agent", agentNumber), mlog.String("cmd", cmd), mlog.String("out", string(out)), mlog.Err(err)) @@ -195,7 +210,7 @@ func (t *Terraform) configureAndRunAgents(extAgent *ssh.ExtAgent) error { } mlog.Info("Starting load-test api server", mlog.Int("agent", agentNumber)) - if out, err := sshc.RunCommand("sudo systemctl daemon-reload && sudo service ltapi restart"); err != nil { + if out, err := sshc.RunCommand("sudo systemctl daemon-reload && sudo systemctl restart ltapi"); err != nil { mlog.Error("error starting load-test api server", mlog.String("output", string(out)), mlog.Err(err), mlog.Int("agent", agentNumber)) foundErr.Store(true) return @@ -217,7 +232,7 @@ func (t *Terraform) initLoadtest(extAgent *ssh.ExtAgent, initData bool) error { return errors.New("there are no agents to initialize load-test") } ip := t.output.Agents[0].PrivateIP - sshc, err := extAgent.NewClient(ip) + sshc, err := extAgent.NewClient(ip, t.Config().AWSAMIUser) if err != nil { return err } @@ -230,7 +245,7 @@ func (t *Terraform) initLoadtest(extAgent *ssh.ExtAgent, initData bool) error { if err != nil { return err } - dstPath := "/home/ubuntu/mattermost-load-test-ng/config/config.json" + dstPath := fmt.Sprintf("/home/%s/mattermost-load-test-ng/config/config.json", t.Config().AWSAMIUser) mlog.Info("Uploading updated config file") if out, err := sshc.Upload(bytes.NewReader(data), dstPath, false); err != nil { return fmt.Errorf("error uploading file, output: %q: %w", out, err) diff --git a/deployment/terraform/assets/bindata.go b/deployment/terraform/assets/bindata.go index ac9362d76..2b892e67f 100644 --- a/deployment/terraform/assets/bindata.go +++ b/deployment/terraform/assets/bindata.go @@ -1,25 +1,25 @@ // Code generated by go-bindata. DO NOT EDIT. // sources: // .terraform.lock.hcl (4.546kB) -// cluster.tf (24.061kB) +// cluster.tf (24.142kB) // coordinator_dashboard_tmpl.json (3.475kB) // dashboard.yaml (231B) -// datasource.yaml (415B) +// datasource.yaml (454B) // default_dashboard_tmpl.json (99.385kB) // elasticsearch.tf (4.162kB) // es_dashboard_data.json (16.697kB) // keycloak-database.sql (141B) // mattermost-realm.json (115.117kB) -// outputs.tf (874B) -// provisioners/agent.sh (1.312kB) -// provisioners/app.sh (2.017kB) -// provisioners/job.sh (1.044kB) -// provisioners/keycloak.sh (1.065kB) -// provisioners/metrics.sh (2.767kB) -// provisioners/proxy.sh (2.212kB) +// outputs.tf (880B) +// provisioners/agent.sh (1.957kB) +// provisioners/app.sh (2.752kB) +// provisioners/job.sh (1.157kB) +// provisioners/keycloak.sh (1.68kB) +// provisioners/metrics.sh (6.847kB) +// provisioners/proxy.sh (2.777kB) // redis_dashboard_data.json (34.045kB) // saml-idp.crt (963B) -// variables.tf (2.833kB) +// variables.tf (2.862kB) package assets @@ -108,7 +108,7 @@ func TerraformLockHcl() (*asset, error) { return a, nil } -var _clusterTf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3c\x6b\x73\xdb\x36\xb6\xdf\xf5\x2b\xce\x65\x32\x3b\xf1\xde\xe8\x61\x4b\x69\x12\xcd\x7a\x33\xde\x36\xcd\xed\x6c\xb3\x9b\x49\xb2\x77\x3f\xa4\x1e\x0e\x44\x42\x12\x22\x92\x40\x01\xd0\x8e\x9a\xf1\xfd\xed\x77\xf0\x24\xc5\x97\x28\x3f\x9b\xce\xb6\x53\xd7\xc6\x39\x00\xce\x1b\xe7\xe0\x41\x89\x39\x47\x4b\xca\x53\xf8\x3a\x00\xe0\xf8\xd7\x9c\x70\x1c\x87\x8c\xd3\x0b\x12\x63\x2e\x74\x33\x00\xba\x14\x70\x6a\x7f\x07\x10\x34\xe7\x11\x06\x38\x85\x60\x8d\xc4\x9a\x44\x94\xb3\x31\xba\x14\x81\x85\x5f\x60\x2e\x08\xcd\x14\xfc\xff\xfe\x0a\xcf\x46\xd3\x97\x06\x72\x35\x50\xff\x5d\x0d\x06\x6e\x78\x08\x54\x2f\x3b\xf5\x4a\x75\x81\x53\xb8\x40\x7c\x84\x2e\x45\x68\x5a\x06\x00\x8c\xd3\x25\x49\x70\x09\xe4\x5b\x4e\x21\x08\xe0\x15\x64\x79\x92\xc0\xbc\x0a\x1e\x00\xc4\x78\x89\xf2\x44\x86\x12\xad\x1c\x2b\xfa\xd7\x53\x48\x31\x5f\xe1\x27\x96\x60\xc7\x18\x40\xf0\x7d\x92\x0b\x89\xf9\x3f\x50\x8a\x03\x3b\x63\x64\x9a\xc2\x0c\xa5\xd8\x22\x5e\x3d\x75\xac\x2a\x78\x2e\x24\x4d\xf5\x1c\xba\xf5\xc8\xb1\x19\x23\x89\x34\x8b\x96\x97\x00\x82\x28\xe7\x1c\x67\x32\x80\xaf\x3b\xf0\x08\x25\x09\xe6\x21\x89\x71\x26\x89\xdc\x36\x23\xae\xa5\x64\x01\x04\xe9\x36\x64\xf9\x22\x21\x51\x48\x98\x91\x5d\xce\x13\xad\x0b\x29\x99\x98\x8f\xc7\xd1\x1a\x47\x1b\xc2\x46\x28\x45\xbf\xd1\x0c\x5d\x8a\x51\x44\xd3\xa0\x20\x08\x7f\x91\x98\x67\x28\x09\x20\x60\x9c\x5c\x20\x89\xfd\x48\x8c\xd3\x15\x47\x29\x9c\xc2\xa7\x40\xac\x83\xa7\x10\x0c\x23\xf5\x13\x47\x6b\x0a\x5f\x7f\xf9\xe5\x97\x80\x30\xf5\x73\xae\x7e\x3c\x7e\xb2\xa6\x42\x2a\xa9\xc0\x90\x1c\xa9\x96\xab\xe0\x5c\x4d\x93\xd0\x08\x25\x46\xde\x9e\x52\xa5\xd9\x68\x4d\x53\xf6\x44\x11\x31\x52\xb4\x8e\xca\x9c\x8c\x38\x16\x8c\x66\x02\x87\x0b\x1a\x6f\x8f\x34\x2d\x8e\x36\x38\x05\xdd\xc9\x11\x3e\x2a\x40\xaa\x5b\x9e\xc8\x11\x61\x6a\x62\x8e\xad\x69\x6a\xa1\x6e\xf0\x36\x64\x88\xf0\x00\x82\x0d\xde\x1a\x06\x55\x9b\xa6\x58\x5b\xef\xe3\xaf\x55\xfd\x5e\x0d\x37\x78\xab\x3b\x15\xc4\x6f\xf0\x16\x4e\x41\x59\xd4\x13\x85\x2e\xc4\x3a\x2c\x20\x47\xf5\x79\x49\x26\x24\xca\x22\x1c\x40\x80\x18\x0b\x05\xe6\x17\x98\x9b\xe9\xad\xf1\x19\x7b\x53\x36\xd6\x46\x05\x62\x6c\xf8\xf8\x6b\x44\xf3\x4c\x8e\x48\x16\xe3\x2f\x57\x81\xb6\xaa\x01\x40\x44\xb3\x0c\x47\x52\x79\x8b\x19\xe7\x11\x7c\x5c\x63\x67\xea\x90\x0b\x25\xa3\x14\xc3\x92\x72\xa0\x39\x87\xb3\xb7\x3f\x19\xc3\xdf\x32\x3d\x9d\x10\x6b\xe3\x8e\x0a\x53\x35\xe4\x8b\x3c\x93\x79\x60\xc7\xfa\xdb\xfb\xb3\x7f\x7c\xff\x3f\x73\xf8\x97\xc0\x4e\x05\xf0\xd3\x3b\x78\x92\x0b\x92\xad\x7c\x8b\xc8\x17\x19\x96\x47\xba\x8f\xb2\x02\x38\x05\x81\x93\x65\x49\x33\x8e\x5c\x94\x12\xa8\xfd\x53\xb8\x32\x4a\xc9\x00\xc0\x89\x2c\xd4\x44\xee\x22\x31\x16\xee\x80\x77\xb5\x58\x1e\xb3\xac\xf4\xd1\x06\x6f\x47\x24\xd6\xf2\xca\x33\xd9\x42\x40\x79\x6c\x8d\xa7\x08\xbe\x40\x24\x41\x0b\x92\x10\xb9\x0d\x7f\xa3\x19\xae\x10\xfc\x9b\xa2\x17\xa5\x45\xc7\x4a\x7c\x62\x2c\x44\x52\xa2\x68\x1d\x2a\xac\x22\x16\x19\x91\x85\x24\xde\xa5\xe3\x49\x82\xb3\x95\x5c\x3f\x29\xdb\x80\x47\x15\x6a\xb8\x23\xf8\x2b\x4c\x8e\xe0\x15\xe0\x04\xa7\x38\x93\x4f\x24\x4d\x88\x90\x5d\x3d\x9e\x42\xc9\x74\x8e\x60\xae\x23\xa4\xd2\xc6\x05\x8b\x42\x81\xa3\x9c\x2b\xe6\x56\x9c\xe6\x4c\xf5\x51\xfe\xee\xe2\x7c\x05\xac\x86\xfb\x34\x39\x1f\x91\xf8\x69\x07\x46\xb8\xa2\x42\x10\x8b\x38\x00\x38\x57\x73\x71\x4a\x65\xb8\x48\x68\xb4\x09\x63\x7c\x41\x22\x6c\xed\xf5\x82\x26\x79\x8a\x43\x41\x7e\x73\x32\x2b\x23\xe9\x76\x11\x22\xc6\xca\xc8\xd6\x78\x6b\xc8\xd6\x20\xb4\xa5\xe9\x55\x45\x2d\x3c\x6a\x61\x51\x42\x0f\xec\x84\x6e\xbd\x2a\x14\x99\x22\x29\x31\x4f\xa9\x90\x61\x42\x22\xac\xc2\x8e\xd5\x92\x5a\x33\x84\x24\x19\x92\x76\x05\x1b\xaf\x69\x8a\xc7\xc6\x47\xc6\x45\xbf\xd2\x10\x43\x3b\x44\xd0\x48\x08\xc7\x29\x95\x78\x88\xbf\xe0\xc8\xd3\x13\x71\xc2\x94\xcb\x04\x25\x4c\x31\x46\x8c\x8d\x8c\x6f\xea\xd5\xa3\xb4\x3c\x68\x43\xa2\x09\x89\xb6\x61\x4c\xa3\x3c\xd5\x0b\x43\x90\x62\xc9\x49\x24\x42\x24\x84\x12\x11\xa7\x8e\x63\x21\x91\xd4\x96\x62\xe7\xc3\xcb\x25\x8e\xf4\x7c\x67\x49\x42\x2f\x83\x81\x6e\x65\x9c\x64\x11\x61\x2e\x52\xfb\x10\xe1\x2d\x33\xf8\x80\xb9\x12\xb2\x5b\xd6\xcd\xea\xb4\x24\x2a\x2d\x50\x0b\x04\x8e\x4e\x2a\x6b\xcc\xb9\x5d\xe6\x8d\xa5\xe8\x18\x65\x50\x85\x14\xf3\x33\x4d\xe6\x7b\x45\xe5\xb9\xe3\xb1\x12\x38\x51\x6a\xb9\xf0\xbc\x15\x4c\xd5\xfc\xbd\x35\x82\xdb\xbe\x43\xdd\x57\x39\x74\x21\x1f\x2b\x45\xb7\xa0\xb4\xc8\x76\xd4\x20\xd9\xd1\x67\x41\xb3\x66\x92\xab\x81\xa0\x44\xbe\x6f\xf1\x1c\x74\xd3\xec\x3b\x68\xf7\xd1\x31\xa5\x2c\x98\x51\x59\x2c\x23\x9d\x8f\x5c\x0d\x06\x8f\xe0\x67\x22\x24\xd0\xa5\xcf\xdf\x80\x61\x9e\x12\x21\xb4\xfc\x25\xda\xe0\x0c\x96\x9c\xa6\x83\x47\xe0\x72\x84\x15\x91\xeb\x7c\xa1\x94\x36\xce\x30\x8f\xc5\x25\xe5\xb1\x18\x6f\xb1\x1c\xa2\x8c\xca\x35\xe6\xc3\x28\xa1\x79\x7c\x89\x64\xb4\x1e\xe2\x2f\x8c\x72\x89\xf9\x78\x91\xd0\xc5\x78\xf9\x2c\x8e\xa3\xe5\x6c\x7a\x32\x8d\xa3\x97\xcf\x27\xd3\xd9\xec\xe5\xf1\xf1\xf1\x2c\x9e\x4d\x9e\xcf\x10\xfe\xee\xf9\x49\xb4\x8c\x66\xc7\xc7\xcb\xf1\xfb\xd7\x67\x3f\xbc\x7d\x3d\x4a\xe3\x47\x28\x97\x6b\x65\x3b\x91\xf6\xaa\xde\x86\x5d\x83\x74\x18\xb7\x31\x07\x6b\xdf\xea\x2f\xa7\x27\x63\x80\x7f\xb6\xb6\x59\x32\x4a\x6b\xd5\x81\x44\xab\xf9\x1b\x2c\xdf\x3b\xfc\xc0\xe5\x76\x41\x21\x02\x85\xf0\x56\x53\xf5\x03\x92\xa8\x1b\xe3\x83\x44\x92\x08\x49\xa2\xe6\x91\x94\xae\x0c\x62\x09\x8e\x18\x59\x21\x89\x2f\xd1\x76\xfe\xe6\xf5\xc7\x72\xbb\xd0\x1d\xfe\x4d\xf9\x46\x30\xb4\x43\x1d\xca\x25\x15\x11\x4a\x48\xb6\x9a\xff\x80\x55\x4c\x59\xe0\xb3\x5c\xd2\x0f\xa6\xed\x8d\x8a\xcd\x25\xf4\x38\x15\x1e\xed\x3d\x66\x89\x55\xc6\x4f\xd6\x78\xf7\x63\x7e\x44\x62\x53\xc2\xc2\xd1\x89\xc7\xfa\xc8\x51\x26\x88\x7c\x63\x58\x38\xd3\xab\x9f\x52\x51\x0b\xfa\x07\x46\xe5\x8f\x09\x56\x32\xff\x35\xc7\xa2\x8c\x26\xd6\x04\x27\xb1\xe6\xf9\x1d\xa7\xd2\xe4\x39\x65\xb8\xa4\x1c\xad\xb0\x13\x96\xc2\xb3\xb3\x76\x23\x7d\x44\x2b\xf1\x23\xe5\x4e\xc9\x05\x2e\x41\xa9\x46\x38\x8b\xf4\x8a\x79\x96\x10\x24\xbc\x30\x7c\x9c\x6a\x09\x54\xd6\x42\x6b\x26\xbb\x13\xb1\xf6\x44\x29\xdb\xc3\x39\x3c\xec\x77\x79\x80\xc3\xa2\x58\xb5\xbd\x25\x92\x15\x59\xab\xeb\x78\xad\xcc\xd5\x76\xfe\xe3\xa4\xab\xfb\x73\x55\x9b\x53\x58\xa9\x55\x93\xd5\x7a\xfe\xd9\x96\x7c\xaa\x3c\x0f\x5e\xc1\x31\xcc\x61\xd2\x98\xe5\xb6\xa5\xb8\xf5\x94\xb5\x92\xaf\xd6\x73\xcf\xbd\x89\xa7\x65\xe7\xc0\xe4\xd3\xf5\xba\xc5\x04\xd4\x0e\x59\x24\xa1\x3a\xb9\x6c\xc9\xc0\xdb\xd6\xe4\x51\x65\x81\x35\x9e\x74\xd3\x24\xd5\x0e\x7a\xa3\x44\xb5\x7f\x7e\x68\x67\x2b\xe7\x88\xad\x2e\xcc\x38\xfd\xb2\xbd\x9e\x03\xeb\xae\x6d\xc5\xe7\xae\x7b\x74\xbb\x86\x81\x1a\x4a\xba\x9d\xa2\x11\xd3\xd5\x63\x8f\x54\x02\x47\x23\xa2\xfc\xd4\x6f\x17\x84\x28\x8e\x39\x16\x8a\x23\xc9\x73\x7c\x47\x3e\xa0\x29\x3a\xd0\x03\x4c\x9f\x5b\xb4\x7f\x3d\x60\xa9\xb2\x2a\x05\x86\xe6\x78\x70\x53\xab\xd6\x13\x1e\x6a\xd3\xdf\x58\x98\xbf\xa6\x0b\x6a\xd1\x74\x38\x20\x4a\x43\x45\x7f\x00\x81\x98\x9a\x5f\xf6\x25\xfe\x16\x6f\x50\x66\xd2\x38\x47\xc7\x2a\x71\x0c\x7f\xfa\x93\x86\x8a\x69\xe8\x36\xc5\xc2\x45\x1e\x6d\xb0\xb4\x86\x61\x37\x46\xdd\x52\xe2\x46\x9c\x34\xd3\x8c\xa2\x08\x0b\x6d\x48\x9a\x72\xbf\x5b\x66\x75\x51\x66\x6d\x64\x08\x56\xf6\x68\x93\x91\x07\xa2\x5b\x4c\x6d\x4f\x4d\xb2\xfb\x55\x51\x6d\x7e\x6f\x11\xf8\xc8\xe3\x36\x90\x7e\x47\xb4\x1f\x10\x7c\xcb\xd4\x69\x43\x5d\x52\x1e\xe1\x30\xc6\x42\x72\xba\x75\xd1\xae\xd5\xf0\x8a\x84\xd4\xa8\xa9\x96\x8e\x76\x5a\x61\x91\x8a\xfe\x8e\x14\x5f\x4e\x77\xff\xf2\x97\xd7\xff\xfc\x71\xa0\x98\x09\xfe\xd7\x9c\x31\x04\x73\x08\x4e\x26\xc7\x27\xc3\xe3\xc9\xf0\xf8\xb9\x4e\xdb\x83\x0f\xae\x42\x0c\xe6\xbe\xca\x2b\x76\xf8\x01\x82\xd7\xba\x64\x54\x5d\x4d\xbd\xf8\xb4\x0c\x3c\xd3\x41\xac\xd4\xd5\x43\xc4\x54\x57\x0a\x7f\x33\x0a\x7a\xda\x09\x7e\x9b\x27\x92\xbc\x43\x5c\xfe\x8b\x25\x14\xc5\xa2\x11\xfd\x07\x9c\x60\x89\x3b\xc6\x7b\x83\xed\x70\x3f\x53\x53\x83\x05\x25\xa4\xf3\x1d\xb2\x7d\x65\x33\x87\x00\xf1\x6c\x8e\x2e\xc5\x5c\x4c\xe7\xf3\xf9\xe3\xaf\x3b\xde\xe2\xed\xdf\xac\x28\x57\x41\xf5\x44\xe3\x6b\x6f\x61\x9c\x2d\x28\x37\x8c\x32\xcf\x68\xab\x58\x2a\x78\x4a\x34\x5d\x42\xf9\xe7\xe2\xb3\x52\x51\x8b\x50\xfa\x40\xcf\xa2\xa4\x11\xe1\x5d\xde\xd5\xdd\x43\x55\xf7\x56\x61\x77\x1a\xd0\x75\x35\x31\xfe\xb3\xd7\x85\x5e\xe7\xaf\x06\xca\xd8\x6b\xae\x8e\x13\x24\x24\x89\x50\xb4\xc6\x2e\xed\xd0\x79\x42\xa0\xd6\xb1\x98\x88\xda\x6e\x59\x8b\xcb\x6b\xe4\xa1\x19\x61\x68\x46\x28\x27\x49\x3a\xb3\xea\x4c\x74\xf4\x00\x47\xbb\xb9\x9c\x09\x01\x1a\x12\xe2\x0c\x2d\x12\x1c\x2b\xcf\xef\xce\xb2\xcc\x40\x3a\x4a\xb8\x00\x70\x48\xc8\xac\x33\xd2\x98\xbc\xd6\xab\xf8\xb2\x24\xed\x90\x4e\x88\x3b\x99\xb3\x9b\x6e\x67\xe7\xbe\x8b\x18\x35\x21\xce\x56\x24\x6b\xd8\xb0\xf4\x08\x19\x8d\x77\x8f\x3b\xaa\xf2\xf3\x08\xdd\x67\x18\xbb\xc2\x2e\x22\x68\x96\xa7\xa1\xe1\x4d\x0d\x24\x5c\x97\x63\x15\x4f\x11\x47\x29\x56\x44\x9b\x04\xd4\xae\x0c\xc5\x68\x1a\xa1\x04\xf4\xfc\x84\xee\x68\xb7\x89\x82\x32\x82\x8e\xda\xbc\x46\x32\x9c\xc2\x77\xd3\xe7\x2f\x95\xa1\xd5\x73\x60\x05\xfd\xd4\x90\x00\xeb\xf1\x8d\x93\x9c\xf7\x3c\x9f\x29\x3b\x86\xaf\xa1\x6f\x6e\x9c\x5d\xfe\x57\x90\xa9\xe7\x9b\x43\x10\xd4\x9d\x37\x5e\x54\x7d\x36\x5e\xf4\x75\xd8\x78\x71\x13\x6f\x8d\x91\x44\x0b\x24\x70\xa3\xc3\xc6\x8b\xa6\x9d\x88\xbd\xb2\xf1\x63\x5e\xdb\x77\x2b\x3c\xb5\x39\xee\xae\x10\x79\x2c\x4a\xfe\x1a\x2f\x8a\x3f\x0e\xaa\x73\xe3\xc5\xd0\x75\x2c\x8a\x98\x06\x37\xdb\xb3\x5f\x63\x13\x9b\x56\x11\x5a\x60\x11\x44\xdc\x21\x4a\x3d\xe7\xa9\xa3\xec\xa8\xa8\x01\xfe\x5f\x76\x88\x20\x50\x06\xd7\xcc\xa5\xe2\xce\x69\xaa\xb6\x9f\xd4\xd4\xc7\x74\x49\x91\x6e\xf1\x85\x1b\x54\x0c\xc6\x01\x0a\x54\x86\x84\x3e\x47\xa8\xa1\x3a\x80\xb2\xd8\x0d\x61\xe1\x92\xa8\xf4\x4f\x64\x88\x89\x35\xb5\x5b\xf7\xae\x8a\x67\x2c\xd9\x86\x24\x4d\x71\xac\x0a\xfe\x64\xeb\x86\xb2\xf0\xc6\xb0\xda\x64\xc6\x06\xb1\x2d\x70\x95\x7a\xb8\x2b\x22\xbb\x78\x9f\x9a\xc7\x53\xf1\xa7\xe2\xc3\xc5\x75\x82\x1b\x18\xc9\x61\x7e\xd6\x10\x49\x46\xf1\x62\x37\xf4\x74\xed\x34\x34\xc4\x58\xd3\x5d\x05\xd8\x2e\x77\x2b\xef\x30\x55\x9b\xc4\xe1\xee\xd7\x7a\xc1\xa1\xd1\x0b\x7b\xf8\xe2\xab\x16\x29\x1b\xff\xaa\xf8\x55\x75\xdc\xfe\x54\xb6\x38\x2a\xf4\x76\xd7\x76\x8c\x39\x54\x44\x5e\xc2\xf3\x7b\x40\x05\x77\x09\x12\x62\xaf\x2b\x68\xac\x76\xdf\xd9\xeb\x41\x2d\x3e\x59\xf1\x4c\x94\x4b\x1a\xa6\x24\xa3\xdc\xf9\x50\x98\xb3\x15\x47\xb1\x71\x8e\x25\x4a\x84\x3e\xba\xc0\x7c\x49\x79\xaa\x67\x20\x99\x20\xab\xb5\x2c\x56\x63\x4f\x84\x69\x08\x9b\x90\x8d\x07\x36\xa6\x30\x96\xa0\x92\x33\x95\x31\xcd\x56\xb6\x0a\x96\x2d\x8a\x66\xab\xc0\xf9\x4e\x63\x8e\x51\x31\x41\x97\x6b\xb4\xc4\x83\x1e\xe6\x7a\xff\x51\xa1\x29\x21\xa9\x88\xd2\x2c\xa9\xba\x51\xb8\x96\xfd\xa7\x59\x46\x7c\x03\x80\x25\x4a\x49\xb2\x6d\x35\x27\xbd\xe8\xa1\x9c\x53\x8e\x86\xe9\x56\xfc\x9a\xe8\xd5\xab\xdc\xf0\x62\x34\xd1\x6a\xb0\x6d\x8c\x0a\xb9\xe2\x58\xfc\x9a\x1c\xcf\xf4\x4a\xb6\xcd\x50\x4a\x22\x08\x3c\xd9\x6e\xcb\x6e\x49\x79\x88\x51\xb4\x2e\xaf\x3b\x4e\xf5\x1a\x21\xa2\x99\x2c\xce\x8d\x2b\x37\x0a\x4e\x8b\xac\x78\x74\x81\x92\x1c\x7f\x0a\x14\xdc\x1e\x1b\x03\xe8\xb6\x0e\x64\xfd\x3f\x8f\x6d\x5c\x26\xc5\x72\x4d\xe3\x26\xec\x32\xdc\xdf\x9a\xd8\xb7\xa7\xaf\xea\x66\x89\x85\x0c\xd1\xca\x9f\x86\xf7\xbf\x50\xa6\xfa\xf4\xbe\x52\xf6\xcd\x1d\xbe\x69\xf6\x7a\xdc\x13\xeb\x7f\x49\xac\x71\x5c\x77\x26\x71\x8d\xb3\x04\x3d\xd2\xa1\x57\xb9\x74\x9f\xe6\xb3\x84\x1e\x27\x1e\xbd\x4e\x4e\x0e\xcd\x14\x34\x4d\x3a\x53\xb8\xf1\x15\x2f\x35\xd2\x3d\x9d\x9d\x19\xaa\x5b\x37\xee\x77\x79\x34\x17\x37\x6d\xf1\x5f\x32\x8c\x9e\xe7\xb6\xbb\xe9\x72\xeb\xf5\x4e\x37\x67\x51\xce\xc5\xd8\x50\x6f\x6f\x9e\x9d\x31\xe6\xcb\x64\xd0\x48\xfa\xf4\xc4\x85\x01\x97\x86\x40\xc3\x04\x2e\xff\x73\x06\xba\x7b\x91\xd9\x40\xf4\x29\x6a\xb6\xd2\xb6\x60\x23\x28\xa7\x69\x68\xcb\xf6\x53\x38\x39\x31\xa1\x80\x86\xbe\x92\xf7\x8d\x8c\x53\x49\x23\x9a\x58\x16\x65\xc4\x4c\x48\x88\x48\xcc\x8d\x3d\x28\xf3\xd1\xf7\x80\x4b\x6e\xee\xf3\x9f\x4f\xc1\xe3\xaf\x16\xe8\xcc\xf2\x6a\x3c\x3d\x09\x9e\x42\x01\xf0\xbd\x34\xe4\x1c\xe6\xad\xbd\xcc\x2d\x8d\x6e\x66\x5e\x4c\xbe\x7b\xd6\xc0\x8e\x6f\xee\xc7\xd0\xa7\x60\x32\xd2\xff\x8e\x27\x7b\x67\xd5\x83\x3f\xaf\xcc\x59\x6a\x2c\x66\x2c\xcf\xf7\x08\xde\xa2\xed\x02\x03\xc7\x42\x72\x12\x49\xa0\x59\xb2\xd5\xa3\xc2\x3b\x4e\xd5\x82\x81\x73\x01\x66\x77\x0a\x5e\xb9\x30\x9c\x4b\x58\xa3\x2c\xde\xc2\xe5\x9a\x24\x18\x24\xda\x98\xf8\xab\x8f\xba\x05\x5c\x12\xb9\xa6\xb9\x84\x14\x65\x39\x4a\x92\x2d\x08\xb1\x1e\x2a\x0c\x92\x49\x0a\x72\x8d\xed\x80\xa3\x1b\xb2\xec\x6c\xed\xe5\xf1\x64\x52\x13\x76\x05\x54\x16\x78\x55\xe8\xbb\xde\xd8\x16\x88\x76\xee\x05\x38\xd2\x1e\x41\x86\x25\xc3\x78\x03\xc5\xd9\xfc\x5e\x72\x27\xb3\xba\x6d\x54\x40\x77\x44\x2e\x6e\xb7\xd8\xba\x04\x5d\x5b\xc5\x56\x87\xc7\xfd\x4c\xb5\x57\xd0\xb3\x17\x79\xef\x37\xf6\x0d\xed\xa4\xbd\x43\xa0\xc1\xbf\xa7\x48\xe8\x22\xc5\xf3\x59\x8b\x91\x78\x50\x83\x91\xe4\xf1\x41\x46\xe2\x2f\x5b\xf7\x75\xb5\x6b\x92\x75\xa0\xed\x5e\x87\xac\x36\x97\xf2\xa0\x87\x91\xd6\x75\xc8\xba\xa9\xb4\xee\xd9\xcb\xf7\xb9\xb9\xdb\x72\xde\x7f\xe6\xdd\xe0\xd9\x1d\x1b\xb9\xb5\x7c\xc6\xfa\xdd\x75\x5d\x6e\x3a\x9d\x7c\xd7\xa2\x2d\x0f\xba\x75\x6d\xf5\xa0\xeb\xd9\x6c\x5a\x4f\x8d\x2a\xa0\x5b\xa7\xab\x47\xf4\x2e\xaa\xc2\x3e\x51\x58\xd7\x83\x7b\x73\xd0\x9f\x5d\x88\xd5\xf8\x77\x9a\x8e\xee\xe1\x30\xe4\xb9\xbe\x5a\x6f\x09\x17\x6b\x5b\x00\x57\x4e\xd0\x34\xc3\x56\x83\x7a\x3f\xa2\xa2\x3e\x9f\xc4\x56\x95\xe7\x01\x55\xd5\x95\x95\x57\xf6\x3e\x07\xbb\xc7\x2c\xb7\x56\xa4\xd9\x7a\xb6\xa5\x44\x3b\x4c\xa4\x88\x91\xeb\x8b\x74\x36\xd1\x79\x5d\x93\x50\x2d\xe8\x50\xb1\x56\x43\xdb\x9d\xf2\x6e\x22\x74\x07\xfb\xb8\x93\xfb\x36\xd6\x5b\xf9\x36\xd1\xfc\xc1\xd9\x76\x77\xd0\x25\x1d\x32\x5f\x5d\xd4\x73\xbf\x8a\x30\x7a\x2d\x17\x75\x29\xf6\xb4\xa5\xfd\x26\xb5\xdf\xb2\x6a\x06\x56\x97\xa2\x47\xe9\x12\xa6\x7b\x3a\x56\xdf\x1d\x69\xee\xb8\x93\xe3\x1f\xa6\x8a\x8c\xc6\xd8\x3f\xb4\xf9\xbd\xa8\xc0\x56\x6b\x1d\x2a\xb0\x18\xdf\xa8\x0a\x8a\xb7\x0e\xb7\x9f\x11\x39\xdf\x3a\x2c\x2d\xea\x69\x33\x7e\x70\xb7\x0c\x5e\xfb\x91\xc1\x7f\xd6\xcf\x5b\x72\x63\xff\x9e\x67\x6f\x20\xbd\x43\xcd\xbc\x9c\xbc\x6c\x5b\x8b\x2c\xe8\x9e\x96\xe1\x9a\x08\x0f\x92\x61\xf1\x5c\x6e\x5f\x44\xbc\x4b\x59\x1e\xeb\x1a\xa3\x51\x96\x06\xf4\x50\xb2\x3c\x44\x94\x2b\x8e\x96\x28\x43\x0f\x20\xbf\x69\x7b\x4a\x38\xbd\xd7\x94\xf0\x66\xee\xbc\xe5\x54\x44\x94\xe1\x07\x90\xe0\x6c\x32\x6b\x4f\xaa\x67\xdf\x8a\x04\x13\xba\x21\x0f\x61\x7e\x6d\xb9\x8b\x07\x7d\x0b\xc2\x2b\x17\x26\xb7\x2b\xbe\xdf\x7b\x45\x73\x68\x22\xd7\x7c\xf9\x79\xcf\xa5\xe1\x7d\xdb\x1f\x1f\xea\xfb\x1d\xba\xa7\x3f\x87\xbe\xad\xed\x65\x7b\x2b\xb6\x69\x4f\xc9\x83\x6e\x71\x4f\xe9\xe9\x5e\x89\x9f\xef\xde\xc6\x3a\x85\xe3\x1e\x3a\xb0\x77\x63\x7b\x6b\xc1\xe2\x5f\x4b\x0f\xb6\xef\xad\x6b\x62\x36\x9b\xb6\x28\xc2\x41\x1e\x56\x0f\x8a\x2b\x2c\xba\x1c\x5e\x7f\x12\xe2\xdf\x18\x32\x8c\x63\x40\x20\x30\x43\x5c\xdf\xc3\xd8\x15\xa2\x8a\x34\x20\x29\x30\x8e\x2f\x70\x26\x21\xda\x46\x09\x89\x20\xc6\x0c\x67\x31\xce\xa2\x2d\x2c\xb0\xbc\xc4\x38\x1b\x3c\xd2\x67\x84\x88\x31\xdb\x13\x65\xb1\x3b\x5e\x33\x2d\xa3\x7e\x85\x2e\x63\x43\x49\x87\x24\x2b\x3f\xd6\x7a\xf8\x22\xf7\xe4\xd9\xbe\x22\xd7\x62\xdc\x7a\x91\xbb\x1b\xe2\x0e\xad\x74\xbd\x11\xf5\x70\x4c\xfd\x6e\xb1\xed\x50\xaf\xe5\xdd\x6d\x0f\xff\x35\x4f\x85\xf7\x7a\xef\x3b\x85\xf6\x90\x57\x19\x5e\x34\x1d\xb3\xbc\x68\x3c\x67\xe9\x7d\xf2\xff\xc7\xba\x3d\xf1\x7b\x3e\xd5\x7f\xe8\x73\xf2\xd2\x15\xbc\xcf\x74\x71\xbd\x47\xf5\x9f\xe9\x62\x68\x3a\xfe\x61\x3f\xeb\xd6\xf7\xaa\x5e\x21\xc3\x3b\xb8\xaf\xd7\x34\x78\xfb\x87\xdd\x6e\xfe\x85\x80\xcf\x74\x71\xe0\x9d\x3e\xd5\xe3\xae\x3e\xcf\x76\xf3\x3b\x79\x9f\xe9\xe2\x46\x37\xf2\xbe\xc1\xcf\xae\x7d\xa6\x8b\xf2\xc5\xc0\xf2\xc7\x2b\xcd\x05\xaa\x70\x99\xa0\x55\xc7\xd7\x47\xcd\xe3\x9b\xe1\xd0\xb5\x1b\xff\x2f\x61\x5e\x55\x2e\x5e\x2b\x6d\x87\xee\x4f\xfd\x56\x3b\x8c\xf3\x74\xe7\xd2\xcd\x29\x3c\xe9\xf5\x98\xda\xbe\xa1\x56\xdd\xc3\x9c\x13\xbb\x46\xf4\x79\x6c\x7d\x54\x7e\xb0\xb5\x23\x3a\x2d\x81\x1d\xc9\x45\x34\x4d\x55\xd2\x77\xaa\x03\x22\x14\xab\x4c\x21\x9f\x2b\x10\x53\x88\x98\x65\xbe\x4e\x99\x82\xcf\xc7\xe3\x3d\x6f\x60\x61\x38\xe4\xca\xbe\x05\xb9\xc0\x5e\x23\xe3\x31\xfc\x1d\x6f\xa3\x84\xa2\x4d\x7b\x64\xde\x58\x8c\x03\xe3\xb2\xef\x76\x2f\x61\xb8\x29\xa4\xc6\x99\xb8\x79\x4c\x75\x6c\xf4\xfe\xf8\x90\xef\x50\x7f\x38\xfa\xb0\x9f\x1d\x72\x84\x1d\x18\x55\x7d\xb7\x5b\x0c\xad\x6e\xcc\xdb\x8c\xaf\x6e\xcc\x3b\x0a\xb2\xbb\x91\xcd\x4d\x36\x72\x36\x59\x8d\xb1\x32\x65\xe3\x52\x0f\x1f\x06\x7b\x04\x53\x92\x25\xfa\x39\x47\xf1\x1d\xbd\x68\x9d\xd2\x18\xfe\xfb\x0b\x34\x0d\xeb\xbf\xb7\xd6\x00\xb4\x31\xc3\x9b\xa4\x7d\x3e\x74\x55\xfd\x08\xdb\x9e\x1a\x67\x37\x02\xd4\xcb\x9c\x0e\x93\xef\x51\xea\xb8\xde\xfb\xab\x9d\xbf\xe3\xed\xf7\x0a\xf3\xae\x0b\x9e\xfb\xcc\x89\xff\x70\xc5\xce\x78\x0c\x1f\x29\x98\xef\xde\x40\xc9\x29\x3b\xab\xc8\xa6\xad\xa1\x52\xf3\x1d\x55\x92\x2f\x26\x2d\xe5\xeb\x0d\x0b\xd8\xab\xc1\xff\x07\x00\x00\xff\xff\xe0\x90\x56\x7d\xfd\x5d\x00\x00") +var _clusterTf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3c\x6b\x73\xdb\x36\xb6\xdf\xf5\x2b\xce\x65\x32\x3b\xf1\xde\xe8\x61\x4b\x69\x12\xcd\x7a\x33\xde\x36\xcd\xed\x6c\xb3\x9b\x49\xb2\x77\x3f\xa4\x1e\x0e\x44\x42\x12\x22\x92\x40\x01\xd0\x8e\x9a\xf1\xfd\xed\x77\xf0\x24\xc5\x97\x28\x3f\x9b\xce\xb6\x53\xd7\xc6\x39\x00\xce\x1b\xe7\xe0\x41\x89\x39\x47\x4b\xca\x53\xf8\x3a\x00\xe0\xf8\xd7\x9c\x70\x1c\x87\x8c\xd3\x0b\x12\x63\x2e\x74\x33\x00\xba\x14\x70\x6a\x7f\x07\x10\x34\xe7\x11\x06\x38\x85\x60\x8d\xc4\x9a\x44\x94\xb3\x31\xba\x14\x81\x85\x5f\x60\x2e\x08\xcd\x14\xfc\xff\xfe\x0a\xcf\x46\xd3\x97\x06\x72\x35\x50\xff\x5d\x0d\x06\x6e\x78\x08\x54\x2f\x3b\xf5\x4a\x75\x81\x53\xb8\x40\x7c\x84\x2e\x45\x68\x5a\x06\x00\x8c\xd3\x25\x49\x70\x09\xe4\x5b\x4e\x21\x08\xe0\x15\x64\x79\x92\xc0\xbc\x0a\x1e\x00\xc4\x78\x89\xf2\x44\x86\x12\xad\x1c\x2b\xfa\xd7\x53\x48\x31\x5f\xe1\x27\x96\x60\xc7\x18\x40\xf0\x7d\x92\x0b\x89\xf9\x3f\x50\x8a\x03\x3b\x63\x64\x9a\xc2\x0c\xa5\xd8\x22\x5e\x3d\x75\xac\x2a\x78\x2e\x24\x4d\xf5\x1c\xba\xf5\xc8\xb1\x19\x23\x89\x34\x8b\x96\x97\x00\x82\x28\xe7\x1c\x67\x32\x80\xaf\x3b\xf0\x08\x25\x09\xe6\x21\x89\x71\x26\x89\xdc\x36\x23\xae\xa5\x64\x01\x04\xe9\x36\x64\xf9\x22\x21\x51\x48\x98\x91\x5d\xce\x13\xad\x0b\x29\x99\x98\x8f\xc7\xd1\x1a\x47\x1b\xc2\x46\x28\x45\xbf\xd1\x0c\x5d\x8a\x51\x44\xd3\xa0\x20\x08\x7f\x91\x98\x67\x28\x09\x20\x60\x9c\x5c\x20\x89\xfd\x48\x8c\xd3\x15\x47\x29\x9c\xc2\xa7\x40\xac\x83\xa7\x10\x0c\x23\xf5\x13\x47\x6b\x0a\x5f\x7f\xf9\xe5\x97\x80\x30\xf5\x73\xae\x7e\x3c\x7e\xb2\xa6\x42\x2a\xa9\xc0\x90\x1c\xa9\x96\xab\xe0\x5c\x4d\x93\xd0\x08\x25\x46\xde\x9e\x52\xa5\xd9\x68\x4d\x53\xf6\x44\x11\x31\x52\xb4\x8e\xca\x9c\x8c\x38\x16\x8c\x66\x02\x87\x0b\x1a\x6f\x8f\x34\x2d\x8e\x36\x38\x05\xdd\xc9\x11\x3e\x2a\x40\xaa\x5b\x9e\xc8\x11\x61\x6a\x62\x8e\xad\x69\x6a\xa1\x6e\xf0\x36\x64\x88\xf0\x00\x82\x0d\xde\x1a\x06\x55\x9b\xa6\x58\x5b\xef\xe3\xaf\x55\xfd\x5e\x0d\x37\x78\xab\x3b\x15\xc4\x6f\xf0\x16\x4e\x41\x59\xd4\x13\x85\x2e\xc4\x3a\x2c\x20\x47\xf5\x79\x49\x26\x24\xca\x22\x1c\x40\x80\x18\x0b\x05\xe6\x17\x98\x9b\xe9\xad\xf1\x19\x7b\x53\x36\xd6\x46\x05\x62\x6c\xf8\xf8\x6b\x44\xf3\x4c\x8e\x48\x16\xe3\x2f\x57\x81\xb6\xaa\x01\x40\x44\xb3\x0c\x47\x52\x79\x8b\x19\xe7\x11\x7c\x5c\x63\x67\xea\x90\x0b\x25\xa3\x14\xc3\x92\x72\xa0\x39\x87\xb3\xb7\x3f\x19\xc3\xdf\x32\x3d\x9d\x10\x6b\xe3\x8e\x0a\xb3\xe4\x54\x28\x25\xa1\x6a\xb2\x63\xfe\xed\xfd\xd9\x3f\xbe\xff\x9f\x39\xfc\x4b\x60\xa7\x0a\xf8\xe9\x1d\x3c\xc9\x05\xc9\x56\xbe\x45\xe4\x8b\x0c\xcb\x23\xdd\x47\x59\x03\x9c\x82\xc0\xc9\xb2\xa4\x21\x47\x36\x4a\x09\xd4\xfe\xd9\x99\x7d\x00\xe0\x44\x17\x6a\x62\x77\x91\x18\x0b\x77\xc0\xbb\xda\x2c\x8f\x59\x56\xfe\x68\x83\xb7\x23\x12\x6b\xb9\xe5\x99\x6c\x21\xa0\x3c\xb6\xc6\x53\x04\x5f\x20\x92\xa0\x05\x49\x88\xdc\x86\xbf\xd1\x0c\x57\x08\xfe\x4d\xd1\x8b\xd2\xa2\x63\x25\x4e\x31\x16\x22\x29\x51\xb4\x0e\x15\x56\x11\x93\x8c\xc8\x42\x12\xef\xd2\xf1\x24\xc1\xd9\x4a\xae\x9f\x94\x6d\xc1\xa3\x0a\x35\xdc\x11\xfc\x15\x26\x47\xf0\x0a\x70\x82\x53\x9c\xc9\x27\x92\x26\x44\xc8\xae\x1e\x4f\xa1\x64\x42\x47\x30\xd7\x91\x52\x69\xe3\x82\x45\xa1\xc0\x51\xce\x15\x73\x2b\x4e\x73\xa6\xfa\x28\xbf\x77\xf1\xbe\x02\x56\xc3\x7d\x9a\x9c\x8f\x48\xfc\xb4\x03\x23\x5c\x51\x21\x88\x45\x1c\x00\x9c\xab\xb9\x38\xa5\x32\x5c\x24\x34\xda\x84\x31\xbe\x20\x11\xb6\x76\x7b\x41\x93\x3c\xc5\xa1\x20\xbf\x39\x99\x95\x91\x74\xbb\x08\x11\x63\x65\x64\x6b\xc4\x35\x64\x6b\x10\xda\xd2\xf4\xea\xa2\x16\x20\xb5\xc0\x28\xa1\x07\x76\x42\xb7\x6e\x15\x8a\x4c\x91\x94\x98\xa7\x54\xc8\x30\x21\x11\x56\xe1\xc7\x6a\x49\xad\x1d\x42\x92\x0c\x49\xbb\x92\x8d\xd7\x34\xc5\x63\xe3\xab\x65\x77\xb9\x1a\x17\x83\x94\xc6\x1b\xda\xf1\x82\x46\xaa\x38\x4e\xa9\xc4\x43\xfc\x05\x47\x9e\xb8\x88\x13\xa6\xfc\x27\x28\x61\x8a\x31\x62\x6c\x64\x1c\x56\x2f\x29\xa5\x35\x43\x5b\x15\x4d\x48\xb4\x0d\x63\x1a\xe5\xa9\x5e\x2d\x82\x14\x4b\x4e\x22\x11\x22\x21\x94\xbc\x38\x75\xec\x0b\x89\xa4\x36\x1b\x3b\x1f\x5e\x2e\x71\xa4\xe7\x3b\x4b\x12\x7a\x19\x0c\x74\x2b\xe3\x24\x8b\x08\x73\xe1\xdb\xc7\x0d\x6f\xa6\xc1\x07\xcc\x95\xc4\xdd\x5a\x6f\x96\xac\x25\x51\xb9\x82\x5a\x35\x70\x74\x52\x59\x78\xce\xed\xda\x6f\xcc\x46\x07\x2e\x83\x2a\xa4\x98\x9f\x69\x32\xdf\x2b\x2a\xcf\x1d\x8f\x95\x68\x8a\x52\xcb\x85\xe7\xad\x60\xaa\xe6\xfc\xad\x61\xdd\xf6\x1d\xea\xbe\xca\xbb\x0b\xf9\x58\x29\xba\x55\xa6\x45\xb6\xa3\x06\xc9\x8e\x3e\x0b\x9a\x35\x93\x5c\x8d\x0a\x25\xf2\x7d\x8b\xe7\xa0\x9b\x66\xdf\x41\xfb\x92\x0e\x30\x65\xc1\x8c\xca\x62\x19\xe9\x24\xe5\x6a\x30\x78\x04\x3f\x13\x21\x81\x2e\x7d\x52\x07\x0c\xf3\x94\x08\xa1\xe5\x2f\xd1\x06\x67\xb0\xe4\x34\x1d\x3c\x02\x97\x38\xac\x88\x5c\xe7\x0b\xa5\xb4\x71\x86\x79\x2c\x2e\x29\x8f\xc5\x78\x8b\xe5\x10\x65\x54\xae\x31\x1f\x46\x09\xcd\xe3\x4b\x24\xa3\xf5\x10\x7f\x61\x94\x4b\xcc\xc7\x8b\x84\x2e\xc6\xcb\x67\x71\x1c\x2d\x67\xd3\x93\x69\x1c\xbd\x7c\x3e\x99\xce\x66\x2f\x8f\x8f\x8f\x67\xf1\x6c\xf2\x7c\x86\xf0\x77\xcf\x4f\xa2\x65\x34\x3b\x3e\x5e\x8e\xdf\xbf\x3e\xfb\xe1\xed\xeb\x51\x1a\x3f\x42\xb9\x5c\x2b\xdb\x89\xb4\x8b\xf5\x36\xec\x1a\xa4\xc3\xb8\x8d\x39\x58\xfb\x56\x7f\x39\x3d\x19\x03\xfc\xb3\xb5\xcd\x92\x51\x5a\xab\x0e\x24\x5a\xcd\xdf\x60\xf9\xde\xe1\x07\x2e\xe1\x0b\x0a\x11\x28\x84\xb7\x9a\xaa\x1f\x90\x44\xdd\x18\x1f\x24\x92\x44\x48\x12\x35\x8f\xa4\x74\x65\x10\x4b\x70\xc4\xc8\x0a\x49\x7c\x89\xb6\xf3\x37\xaf\x3f\x96\xdb\x85\xee\xf0\x6f\xca\x37\x82\xa1\x1d\xea\x50\x2e\xa9\x88\x50\x42\xb2\xd5\xfc\x07\xac\x62\xca\x02\x9f\xe5\x92\x7e\x30\x6d\x6f\x54\xa0\x2e\xa1\xc7\xa9\xf0\x68\xef\x31\x4b\xac\x32\x7e\xb2\xc6\xbb\x1f\xf3\x23\x12\x9b\x12\x16\x8e\x4e\x3c\xd6\x47\x8e\x32\x41\xe4\x1b\xc3\xc2\x99\x5e\x0a\x95\x8a\x5a\xd0\x3f\x30\x2a\x7f\x4c\xb0\x92\xf9\xaf\x39\x16\x65\x34\xb1\x26\x38\x89\x35\xcf\xef\x38\x95\x26\xf9\x29\xc3\x25\xe5\x68\x85\x9d\xb0\x14\x9e\x9d\xb5\x1b\xe9\x23\x5a\x89\x1f\x29\x77\x4a\x2e\x70\x09\x4a\x35\xc2\x59\xa4\x97\xcf\xb3\x84\x20\xe1\x85\xe1\xe3\x54\x4b\xa0\xb2\x16\x5a\x33\xd9\x9d\x88\xb5\x27\x4a\xd9\x1e\xce\xe1\x61\xbf\xcb\x03\x1c\x16\xc5\xaa\xed\x2d\x91\xac\x48\x65\x5d\xc7\x6b\xa5\xb3\xb6\xf3\x1f\x2f\x87\xdd\x9f\xc0\xda\x44\xc3\x4a\xaf\x9a\xc1\xd6\x93\xd2\xb6\x8c\x54\x25\x7f\xf0\x0a\x8e\x61\x0e\x93\xc6\xd4\xb7\x2d\xef\xad\xe7\xb1\x95\x24\xb6\x9e\x90\xee\xcd\x46\x2d\x3b\x07\x66\xa4\xae\xd7\x2d\x66\xa5\x76\xc8\x22\x33\xd5\x19\x67\x4b\x5a\xde\xb6\x36\x8f\x2a\x0b\xad\xf1\xa8\x9b\x66\xae\x76\xd0\x1b\x65\xaf\xfd\xf3\x44\x3b\x5b\x39\x57\x6c\x75\x65\xc6\xe9\x97\xed\xf5\x1c\x59\x77\x6d\xab\x4c\x77\xdd\xa3\xdb\x35\x0c\xd4\x50\xd2\xed\x14\x8d\x98\xae\x48\x7b\xa4\x12\x39\x1a\x11\xe5\xa7\x7e\x2f\x21\x44\x71\xcc\xb1\x50\x1c\x49\x9e\xe3\x3b\xf2\x01\x4d\xd1\x81\x1e\x60\xfa\xdc\xa2\xfd\xeb\x01\x4b\xe5\x56\x29\x30\x34\xc7\x83\x9b\x5a\xb5\x9e\xf0\x50\x9b\xfe\x46\xc3\xfd\x35\x5d\x51\x8b\xa8\xc3\x11\x51\xaa\x89\x0e\x20\x10\x53\xf3\xcb\xbe\x42\xc0\xe2\x0d\xca\x4c\x1a\x27\xe9\x58\x2d\x8e\xe1\x4f\x7f\xd2\x50\x31\x0d\xdd\xce\x59\xb8\xc8\xa3\x0d\x96\xd6\x40\xec\xee\xa9\x5b\x52\xdc\x88\x93\x66\x9a\x51\x14\x61\xa1\x0d\x4a\x53\xee\xb7\xd4\xac\x4e\xca\xac\x8d\x0c\xc1\xca\x2e\x6d\x72\xf2\x40\x74\x8b\xa9\xed\xa9\x49\x76\xbf\x2a\xaa\xcd\xef\x2d\x02\x1f\x79\xdc\x06\xd2\xef\x88\xf6\x03\x82\x70\x99\x3a\x6d\xa8\x4b\xca\x23\x1c\xc6\x58\x48\x4e\xb7\x2e\xea\xb5\x1a\x5e\x91\xa0\x1a\x35\xd5\xd2\xd3\x4e\x2b\x2c\x52\xd3\xdf\x91\xe2\xcb\xe9\xef\x5f\xfe\xf2\xfa\x9f\x3f\x0e\x14\x33\xc1\xff\x9a\x83\x88\x60\x0e\xc1\xc9\xe4\xf8\x64\x78\x3c\x19\x1e\x3f\xd7\x69\x7c\xf0\xc1\x55\x8c\xc1\xdc\x57\x7d\xc5\x31\x00\x40\xf0\x5a\x97\x90\xaa\xab\xa9\x1f\x9f\x96\x81\x67\x3a\x98\x95\xba\x7a\x88\x98\xea\xca\xe1\x6f\x46\x41\x4f\x3b\xc1\x6f\xf3\x44\x92\x77\x88\xcb\x7f\xb1\x84\xa2\x58\x34\xa2\xff\x80\x13\x2c\x71\xc7\x78\x6f\xb0\x1d\xee\x67\x6a\x6a\xb2\xa0\x84\x74\xbe\x43\xb6\xaf\x74\xe6\x10\x20\x9e\xcd\xd1\xa5\x98\x8b\xe9\x7c\x3e\x7f\xfc\x75\xc7\x5b\xbc\xfd\x9b\x95\xe5\x2a\xa8\x1e\x7b\x7c\xed\x2d\x8c\xb3\x05\xe5\x86\x51\xe6\x19\x6d\x15\x4b\x05\x4f\x89\xa6\x4b\x28\xff\x5c\x7c\x56\x2a\x6a\x11\x4a\x1f\xe8\x59\x94\x34\x22\xbc\xcb\xbb\xba\x7b\xa8\xea\xde\x2a\xec\x4e\x03\xba\xae\x26\xc6\x7f\xf6\xba\xd0\xeb\xfd\xd5\x40\x19\x7b\xcd\xd5\x71\x82\x84\x24\x11\x8a\xd6\xd8\xa5\x1f\x3a\x5f\x08\xd4\x3a\x16\x13\x51\xdb\x3d\x6b\x71\x79\x8d\x3c\x34\x23\x0c\xcd\x08\xe5\x64\x49\x67\x58\x9d\x09\x8f\x1e\xe0\x68\x37\xa7\x33\x21\x40\x43\x42\x9c\xa1\x45\x82\x63\xe5\xf9\xdd\xd9\x96\x19\x48\x47\x09\x17\x00\x0e\x09\x99\x75\x46\x1a\x93\xd8\x7a\x55\x5f\x96\xa4\x1d\xd2\x09\x71\x27\x83\x76\xd3\xed\x6c\xeb\x77\x11\xa3\x26\xc4\xd9\x8a\x64\x0d\x1b\x98\x1e\x21\xa3\xf1\xee\x59\x48\x55\x7e\x1e\xa1\xfb\x80\x63\x57\xd8\x45\x04\xcd\xf2\x34\x34\xbc\xa9\x81\x84\xeb\x72\xac\xe2\x29\xe2\x28\xc5\x8a\x68\x93\x88\xda\x95\xa1\x18\x4d\x23\x94\x80\x9e\x9f\xd0\x9d\xff\x36\x51\x50\x46\xd0\x51\x9b\xd7\x48\x86\x53\xf8\x6e\xfa\xfc\xa5\x32\xb4\x7a\x2e\xac\xa0\x9f\x1a\x12\x61\x3d\xbe\x71\x92\xf3\x9e\x87\x37\x65\xc7\xf0\xb5\xf4\xcd\x8d\xb3\xcb\xff\x0a\x32\xf5\x7c\x73\x08\x82\xba\xf3\xc6\x8b\xaa\xcf\xc6\x8b\xbe\x0e\x1b\x2f\x6e\xe2\xad\x31\x92\x68\x81\x04\x6e\x74\xd8\x78\xd1\xb4\x23\xb1\x57\x36\x7e\xcc\x6b\xfb\x6e\x85\xa7\x36\xc7\xdd\x15\x22\x8f\x45\xc9\x5f\xe3\x45\xf1\xc7\x41\xf5\x6e\xbc\x18\xba\x8e\x45\x31\xd3\xe0\x66\x7b\xf6\x6d\x6c\x62\xd3\x2a\x42\x0b\x2c\x82\x88\x3b\x54\xa9\xe7\x3c\x75\x94\x1d\x15\x35\xc0\xff\xcb\x0e\x11\x04\xca\xe0\x9a\xb9\x54\xdc\x39\x4d\xd5\xf6\x95\x9a\xfa\x98\x2e\x29\xd2\x2d\xbe\x80\x83\x8a\xc1\x38\x40\x81\xca\x90\xd0\xe7\x0a\x35\x54\x07\x50\x16\xbb\x21\x2c\x5c\x12\x95\xfe\x89\x0c\x31\xb1\xa6\x76\x2b\xdf\x55\xf3\x8c\x25\xdb\x90\xa4\x29\x8e\x55\xe1\x9f\x6c\xdd\x50\x16\xde\x18\x56\x9b\xcc\xd8\x20\xb6\x05\xae\x52\x0f\x77\x8f\x64\x17\xef\x53\xf3\x78\x2a\xfe\x54\x7c\xb8\xb8\x73\x70\x03\x23\x39\xcc\xcf\x1a\x22\xc9\x28\x5e\xec\x86\x9e\xae\x1d\x87\x86\x18\x6b\xba\xab\x00\xdb\xe5\x6e\xe5\x9d\xa6\x6a\x93\x38\xdc\xfd\x5a\x6f\x41\x34\x7a\x61\x0f\x5f\x7c\xd5\x22\x65\xe3\x5f\x15\xbf\xaa\x8e\xdb\x9f\xca\x16\x47\x85\xde\xee\xda\x8e\x31\x87\x8a\xc8\x4b\x78\x7e\x2f\xa8\xe0\x2e\x41\x42\xec\x75\x05\x8d\xd5\xee\x3b\x7b\x3d\xa8\xc5\x27\x2b\x9e\x89\x72\x49\xc3\x94\x64\x94\x3b\x1f\x0a\x73\xb6\xe2\x28\x36\xce\xb1\x44\x89\xd0\x47\x19\x98\x2f\x29\x4f\xf5\x0c\x24\x13\x64\xb5\x96\xc5\x6a\xec\x89\x30\x0d\x61\x13\xb2\xf1\xc0\xc6\x14\xc6\x12\x54\x72\xa6\x32\xa6\xd9\xd2\x56\xc1\xb2\x45\xd1\x6c\x15\x38\xdf\x69\xcc\x31\x2a\x26\xe8\x72\x8d\x96\x78\xd0\xc3\x5c\xef\x3f\x2a\x34\x25\x24\x15\x51\x9a\x25\x55\x37\x0a\xd7\xb2\xff\x74\xcb\x88\x6f\x00\xb0\x44\x29\x49\xb6\xad\xe6\xa4\x17\x3d\x94\x73\xca\xd1\x30\xdd\x8a\x5f\x13\xbd\x7a\x95\x1b\x5e\x8c\x26\x5a\x0d\xb6\x8d\x51\x21\x57\x1c\x8b\x5f\x93\xe3\x99\x5e\xc9\xb6\x19\x4a\x49\x04\x81\x27\xdb\x6d\xd9\x2d\x29\x0f\x31\x8a\xd6\xe5\x75\xc7\xa9\x5e\x23\x44\x34\x93\xc5\x39\x72\xe5\x86\xc1\x69\x91\x15\x8f\x2e\x50\x92\xe3\x4f\x81\x82\xdb\x63\x64\x00\xdd\xd6\x81\xac\xff\xe7\xb1\x8d\xcb\xa4\x58\xae\x69\xdc\x84\x5d\x86\xfb\x5b\x14\xfb\xf6\xf6\x55\xdd\x2c\xb1\x90\x21\x5a\xf9\xd3\xf1\xfe\xb7\xce\x54\x9f\xde\xf7\xce\xbe\xd9\xc3\x38\xcd\x66\x8f\xcb\x64\xfd\x6f\x92\x35\x8e\xeb\xce\x28\xae\x71\xb6\xa0\x47\x3a\xf4\xbe\x97\xee\xd3\x7c\xb6\xd0\xe3\x04\xa4\xd7\x49\xca\xa1\x19\x83\xa6\x49\x67\x0c\x37\xbe\x07\xa6\x46\xba\xa7\xb3\x34\x43\x75\xeb\x06\xfe\x2e\x8f\xe6\x96\xa7\xdd\x04\x28\x19\x46\xcf\x73\xdc\xdd\xb4\xb9\xf5\x2e\xa8\x9b\xb3\x28\xeb\x62\x6c\xa8\xb7\xd7\xd3\xce\x18\xf3\xe5\x32\x68\x24\x7d\x9a\xe2\xc2\x81\x4b\x47\xa0\x61\x02\x97\x07\x3a\x03\xdd\xbd\xf5\x6c\x20\xfa\x54\x35\x5b\x69\x5b\xb0\x91\x94\xd3\x34\xb4\xe5\xfb\x29\x9c\x9c\x98\x90\x40\x43\x5f\xd1\xfb\x46\xc6\xa9\xa4\x11\x4d\x2c\x8b\x32\x62\x26\x5c\x44\x24\xe6\xc6\x1e\x94\xf9\xe8\x4b\xc3\x25\x37\xf7\x79\xd0\xa7\xe0\xf1\x57\x0b\x74\x66\x79\x35\x9e\x9e\x04\x4f\xa1\x00\xf8\x5e\x1a\x72\x0e\xf3\xd6\x5e\xe6\xf6\x46\x37\x33\x2f\x26\xdf\x3d\x6b\x60\xc7\x37\xf7\x63\xe8\x53\x30\x19\xe9\x7f\xc7\x93\xbd\xb3\xea\xc1\x9f\x57\xe6\x2c\x35\x16\x33\x96\xe7\x7b\x04\x6f\xd1\x76\x81\x81\x63\x21\x39\x89\x24\xd0\x2c\xd9\xea\x51\xe1\x1d\xa7\x6a\xe1\xc0\xb9\x00\xb3\x4b\x05\xaf\x5c\x18\xce\x25\xac\x51\x16\x6f\xe1\x72\x4d\x12\x0c\x12\x6d\x4c\xfc\xd5\x47\xdf\x02\x2e\x89\x5c\xd3\x5c\x42\x8a\xb2\x1c\x25\xc9\x16\x84\x58\x0f\x15\x06\xc9\x24\x05\xb9\xc6\x76\xc0\xd1\x0d\x59\x76\xb6\xf6\xf2\x78\x32\xa9\x09\xbb\x02\x2a\x0b\xbc\x2a\xf4\x5d\x6f\x6c\x0b\x44\x3b\xf7\x04\x1c\x69\x8f\x20\xc3\x92\x61\xbc\x81\xe2\xac\x7e\x2f\xb9\x93\x59\xdd\x36\x2a\xa0\x3b\x22\x17\xb7\x5b\x6c\x5d\x82\xae\xad\x62\xab\xc3\xe3\x7e\xa6\xda\x2b\xe8\xd9\xdb\xbe\xf7\x1b\xfb\x86\x76\xd2\xde\x21\xd0\xe0\xdf\x53\x24\x74\x91\xe2\xf9\xac\xc5\x48\x3c\xa8\xc1\x48\xf2\xf8\x20\x23\xf1\x37\xb2\xfb\xba\xda\x35\xc9\x3a\xd0\x76\xaf\x43\x56\x9b\x4b\x79\xd0\xc3\x48\xeb\x3a\x64\xdd\x54\x5a\xf7\xec\xe5\xfb\xdc\xdc\x6d\x3d\xef\x3f\xfb\x6e\xf0\xec\x8e\x0d\xdd\x5a\x3e\x63\xfd\xee\xba\x2e\x37\x9d\x4e\xbe\x6b\xd1\x96\x07\xdd\xba\xb6\x7a\xd0\xf5\x6c\x36\xad\xa7\x46\x15\xd0\xad\xd3\xd5\x23\x7a\x17\xd5\x61\x9f\x28\xac\xeb\xc2\xbd\x39\xe8\xcf\x2e\xc4\x6a\xfc\x3b\x4d\x47\xf7\x70\x18\xf2\x5c\x5f\xb9\xb7\x84\x8b\xb5\x2d\x84\x2b\x27\x69\x9a\x61\xab\x41\xbd\x2f\x51\x51\x9f\x4f\x62\xab\xca\xf3\x80\xaa\xea\xca\xca\x2b\x7b\x9f\x83\xdd\x63\x96\x5b\x2b\xd2\x6c\x3d\xdb\x52\xa2\x1d\x26\x52\xc4\xc8\xf5\x45\x3a\x9b\xe8\xbc\xae\x49\xa8\x16\x74\xa8\x58\xab\xa1\xed\x4e\x79\x37\x11\xba\x83\x7d\xdc\xc9\x7d\x1b\xeb\xad\x7c\x9b\x68\xfe\xe0\x6c\xbb\xbb\xe9\x92\x0e\x99\xaf\x2e\xea\xb9\x5f\x45\x18\xbd\x96\x8b\xba\x14\x7b\xda\xd2\x7e\x93\xda\x6f\x59\x35\x03\xab\x4b\xd1\xa3\x74\x09\xd3\xbd\x2f\xab\xef\x8e\x34\x77\xdc\xc9\xf1\x0f\x53\x45\x46\x63\xec\x1f\xe0\xfc\x5e\x54\x60\xab\xb5\x0e\x15\x58\x8c\x6f\x54\x05\xc5\x1b\x88\xdb\xcf\x88\x9c\x6f\x1d\x96\x16\xf5\xb4\x19\x3f\xb8\x5b\x06\xaf\xfd\xe8\xe0\x3f\xeb\xe7\x2d\xb9\xb1\x7f\xe7\xb3\x37\x90\xde\xa1\x66\x5e\x4e\x5e\xb6\xad\x45\x16\x74\x4f\xcb\x70\x4d\x84\x07\xc9\xb0\x78\x46\xb7\x2f\x22\xde\xa5\x2c\x8f\x75\x8d\xd1\x28\x4b\x03\x7a\x28\x59\x1e\x22\xca\x15\x47\x4b\x94\xa1\x07\x90\xdf\xb4\x3d\x25\x9c\xde\x6b\x4a\x78\x33\x77\xde\x72\x2a\x22\xca\xf0\x03\x48\x70\x36\x99\xb5\x27\xd5\xb3\x6f\x45\x82\x09\xdd\x90\x87\x30\xbf\xb6\xdc\xc5\x83\xbe\x05\xe1\x95\x0b\x93\xdb\x15\xdf\xef\xbd\xa2\x39\x34\x91\x6b\xbe\x04\xbd\xe7\xf2\xf0\xbe\xed\x8f\x0f\xf5\xfd\x0e\xdd\xd3\x9f\x43\xdf\xd6\xf6\xb2\xbd\x1d\xdb\xb4\xa7\xe4\x41\xb7\xb8\xa7\xf4\x74\xaf\xc4\xcf\x77\x6f\x65\x9d\xc2\x71\x0f\x1d\xd8\x3b\xb2\xbd\xb5\x60\xf1\xaf\xa5\x07\xdb\xf7\xd6\x35\x31\x9b\x4d\x5b\x14\xe1\x20\x0f\xab\x07\xc5\x15\x16\x5d\x0e\xaf\x3f\x15\xf1\x6f\x0c\x19\xc6\x31\x20\x10\x98\x21\xae\xef\x61\xec\x0a\x51\x45\x1a\x90\x14\x18\xc7\x17\x38\x93\x10\x6d\xa3\x84\x44\x10\x63\x86\xb3\x18\x67\xd1\x16\x16\x58\x5e\x62\x9c\x0d\x1e\xe9\x33\x42\xc4\x98\xed\x89\xb2\xd8\x1d\xaf\x99\x96\x51\xbf\x42\x97\xb1\xa1\xa4\x43\x92\x95\x1f\x6d\x3d\x7c\x91\x7b\xf2\x6c\x5f\x91\x6b\x31\x6e\xbd\xc8\xdd\x0d\x71\x87\x56\xba\xde\x88\x7a\x38\xa6\x7e\xbf\xd8\x76\xa8\xd7\xf2\x0e\xb7\x87\xff\x9a\xa7\xc3\x7b\xbd\xf7\x9d\x42\x7b\xc8\xab\x0c\x2f\x9a\x8e\x59\x5e\x34\x9e\xb3\xf4\x3e\xf9\xff\x63\xdd\x9e\xf8\x3d\x9f\xea\x3f\xf4\x39\x79\xe9\x2a\xde\x67\xba\xb8\xde\x23\xfb\xcf\x74\x31\x34\x1d\xff\xf0\xdf\x80\xeb\x7b\x65\xaf\x90\xe5\x1d\xdc\xdb\x6b\x1a\xbc\xfd\x2b\x70\x37\xff\x72\xc0\x67\xba\x38\xf0\x6e\x9f\xea\x71\x57\xdf\x72\xbb\xf9\xdd\xbc\xcf\x74\x71\xa3\x9b\x79\xdf\xfa\x37\xda\x3e\xd3\x45\xf9\xb6\x60\xf9\xf3\x97\xe6\x56\x55\xb8\x4c\xd0\xaa\xe3\xfb\xa5\xe6\x65\xce\x70\xe8\xda\x0b\x0e\x6c\xcb\x55\xe5\x56\xb6\x52\x7d\xe8\xfe\xd4\x0f\xb9\xc3\x38\x4f\x77\x6e\xe2\x9c\xc2\x93\x5e\x2f\xad\xed\x03\x6b\xd5\x3d\xcc\x39\xb1\x0b\x47\x9f\x97\xd8\x47\xe5\xd7\x5c\x3b\xa2\xd3\x12\xd8\x91\x5c\x44\xd3\x54\x65\x82\xa7\x3a\x4a\x42\xb1\xf4\x14\xf2\xb9\x02\x31\x85\x88\x59\xe6\xeb\x94\x29\xf8\x7c\x3c\xde\xf3\x40\x16\x86\x43\xae\x8c\x5d\x90\x0b\xec\x35\x32\x1e\xc3\xdf\xf1\x36\x4a\x28\xda\xb4\x87\xeb\x8d\xc5\xb8\x5e\xcc\x76\xbd\xef\x37\x44\x37\x85\xdb\x38\x13\x37\x8f\xb7\x5e\x18\x7d\x3f\x58\xe4\x3b\xd4\x1f\x99\x3e\xec\xa7\x8a\x1c\x61\x07\x46\x5c\xdf\xed\x16\xc3\xae\x1b\xf3\x36\x63\xaf\x1b\xf3\x8e\x02\xf0\x6e\xa0\x73\x93\x8d\x9c\x6d\x56\xe3\xaf\x4c\xd9\xb8\xd4\xc3\x47\xc5\x1e\xb1\x95\x64\x89\x7e\xfa\x51\x7c\x83\x2f\x5a\xa7\x34\x86\xff\xfe\x02\x4d\xc3\xfa\x6f\xb5\x35\x00\x6d\x08\xf1\x26\x69\x9f\x1a\x5d\x55\x3f\xe0\xb6\xa7\x0e\xf2\x2e\xdd\x52\x0a\x75\x98\x7c\x8f\x72\xc8\xf5\xde\x5f\x11\xfd\x1d\x6f\xbf\x57\x98\x77\x5d\x14\xdd\x67\xde\xfc\x87\x2b\x88\xc6\x63\xf8\x48\xc1\x7c\x23\x07\x4a\x4e\xd9\x59\x69\x36\x6d\x1f\x95\x9a\xef\xa8\xda\x7c\x31\x69\x29\x71\x6f\x58\xe4\x5e\x0d\xfe\x3f\x00\x00\xff\xff\xc7\x2e\x62\x2c\x4e\x5e\x00\x00") func clusterTfBytes() ([]byte, error) { return bindataRead( @@ -124,7 +124,7 @@ func clusterTf() (*asset, error) { } info := bindataFileInfo{name: "cluster.tf", size: 0, mode: os.FileMode(0644), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2e, 0x40, 0x59, 0x56, 0x30, 0xda, 0x6a, 0x82, 0x78, 0xc3, 0x8f, 0xfb, 0x29, 0xe7, 0x40, 0xda, 0xc0, 0x61, 0x42, 0x2e, 0x11, 0xf9, 0x3e, 0xc3, 0x4c, 0xc8, 0xc9, 0xad, 0x46, 0xc6, 0x57, 0x36}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x93, 0x7, 0xae, 0x71, 0x1b, 0xdb, 0x1, 0x85, 0x4f, 0x51, 0x18, 0x54, 0x8a, 0x7f, 0x4, 0xfe, 0xb6, 0xe1, 0xed, 0xcc, 0xba, 0xcb, 0x93, 0xe, 0xa9, 0x8c, 0x54, 0x9b, 0x8c, 0xa, 0x5b, 0xb8}} return a, nil } @@ -168,7 +168,7 @@ func dashboardYaml() (*asset, error) { return a, nil } -var _datasourceYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x8f\x31\x6b\xc3\x30\x10\x85\x77\xfd\x8a\x47\x42\xe9\x14\xe2\x50\xda\x41\x73\x96\x40\xe6\xee\x17\xeb\x1c\x5f\x2b\x4b\x46\x77\x72\x93\x7f\x5f\xec\x80\x5b\x4a\x37\x3d\xbd\xe3\xbb\xef\xb6\x68\x73\xea\xe4\x8a\x4e\x22\x63\xe2\xa2\x92\x93\xa3\x51\xde\x1f\x4f\x8f\x83\x73\x5b\x44\x51\x43\xee\x10\xc8\x48\x73\x2d\x2d\x2b\x2c\x43\x92\x72\xb1\x7d\x1d\x03\x19\x23\xf0\xc8\x29\x48\xba\xba\x2d\xbe\x7a\xb2\x67\x05\x4d\x24\x91\x2e\x91\x21\x09\xd6\xf3\x02\xb8\x90\xb2\xfb\x45\xf2\x6e\x87\x44\x03\x7b\xc4\x4c\xc1\x58\x6d\xf7\x68\x1c\x60\xf7\x91\x3d\xc6\x92\x07\xb6\x9e\xab\x3a\x80\xda\x96\x55\x97\xcf\xdb\xdd\x01\xb9\x5c\x4f\x61\xf6\x04\x6a\x89\x1e\x4f\xf3\x90\xe8\x91\x3b\xaa\xd1\x3c\xac\xd4\x99\x34\xfd\x1c\x04\x70\x10\x9b\xb5\xd6\xf6\x43\x73\x3a\x92\x91\x77\x00\x60\x32\xf0\x29\x19\x97\x89\xa2\xc7\xe6\x55\x37\xab\xe2\x39\x7f\xca\xea\x15\x1f\xe1\xaf\xd1\xa2\xd1\x9b\x8d\x7e\xbf\x8f\xb9\xa5\xd8\x67\x35\xff\x72\x68\x9a\x7f\x37\xe5\x6a\x1e\x6f\xcd\x92\x07\xba\x9d\x25\xb1\x7a\x1c\x9a\xa6\x71\xdf\x01\x00\x00\xff\xff\x27\x54\x02\x92\x9f\x01\x00\x00") +var _datasourceYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x8f\x4f\x4b\x03\x31\x10\xc5\xef\xf9\x14\x8f\xf6\xe0\xa9\x34\x45\x14\x9a\x73\x45\x0a\xf5\x26\xde\xa7\x9b\xd9\x6e\x34\x9b\x2c\x99\xc9\xda\x7e\x7b\xd9\x2d\x54\x51\x6f\xf3\x07\x7e\xef\xf7\x96\x68\x72\x6a\xc3\x09\x6d\x88\x8c\x91\x8b\x84\x9c\x0c\x0d\xe1\xed\x3a\x3a\x6c\x8c\x59\x22\x06\x51\xe4\x16\x9e\x94\x24\xd7\xd2\xb0\x40\x33\x42\x12\x2e\xba\xae\x83\x27\x65\x78\x1e\x38\xf9\x90\x4e\x66\x89\xcf\x8e\xf4\x4e\x40\x23\x85\x48\xc7\xc8\x08\x09\xda\xf1\x0c\x38\x92\xb0\xf9\x41\x72\x66\x85\x44\x3d\x3b\xc4\x4c\x5e\x59\x74\x75\xfd\x18\x40\x2f\x03\x3b\x0c\x25\xf7\xac\x1d\x57\x31\x00\x35\x0d\x8b\xcc\xc7\xf3\xc5\x00\xb9\x9c\xf6\x7e\xf2\x04\x6a\x89\x0e\x9d\xea\xe0\xd6\xeb\x98\x1b\x8a\x5d\x16\x75\x5b\xbb\xb5\x06\x08\xb2\xe3\x96\x6a\x54\x07\x2d\x75\x82\x8f\xdf\x1d\x01\xf6\x41\x27\xd3\xdb\xf7\x5d\x72\xda\x91\x92\x33\x00\x66\xea\x0b\x6b\x97\xbd\xc3\xf3\xd3\xeb\x7c\xd3\xd0\xf3\x3e\x29\x97\x91\xa2\xc3\xe2\x41\x16\xb7\x26\x87\xfc\x11\x6e\xfa\xf1\xba\xfc\x16\xff\xdf\xf6\x7e\x63\xed\x9f\xf4\x29\x29\x57\x75\x78\xb4\xf3\xde\xd3\xf9\x10\x12\x8b\xc3\xc6\x5a\x6b\xbe\x02\x00\x00\xff\xff\x3b\xb2\x4b\x71\xc6\x01\x00\x00") func datasourceYamlBytes() ([]byte, error) { return bindataRead( @@ -184,7 +184,7 @@ func datasourceYaml() (*asset, error) { } info := bindataFileInfo{name: "datasource.yaml", size: 0, mode: os.FileMode(0644), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1c, 0x20, 0x77, 0x6c, 0xf2, 0xc6, 0x96, 0x3c, 0x3a, 0xa, 0x49, 0xfa, 0x22, 0xb6, 0xde, 0x88, 0x77, 0x34, 0x21, 0xd0, 0x51, 0x5f, 0xb2, 0xfd, 0x18, 0x2f, 0x16, 0xc4, 0x16, 0x9e, 0xbb, 0x4d}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xbb, 0x74, 0xa1, 0xc4, 0xe6, 0x7b, 0x12, 0xcc, 0xdb, 0xdf, 0x3d, 0xea, 0x8e, 0x9c, 0xed, 0x75, 0x89, 0x8a, 0xef, 0x7, 0x75, 0xab, 0xa3, 0x43, 0x85, 0xf5, 0x9a, 0x43, 0xbf, 0x67, 0x94, 0x6d}} return a, nil } @@ -288,7 +288,7 @@ func mattermostRealmJson() (*asset, error) { return a, nil } -var _outputsTf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x93\xbf\x6e\xf3\x30\x0c\xc4\x77\x3f\x85\x90\xf1\x1b\xbc\x64\xfe\x86\xa2\x43\x87\x02\x1d\x92\xb1\x28\x04\x5a\x22\x12\xc5\x8a\x64\x90\x54\x5a\xa3\xe8\xbb\x17\xfe\xd7\x3a\xb1\xea\x78\x31\xe0\xe3\xfd\x78\x3a\xdb\x31\x49\x93\x44\x6d\x5c\x60\x81\x60\x90\x37\xea\xb3\x50\xea\x02\x3e\xa1\xfa\xaf\xe0\x9d\xf5\x24\x95\xd0\x34\x9a\x91\x2e\x48\xaf\xff\xde\x8a\xaf\xa2\x98\xcc\xb6\x7a\xf4\x89\x05\x69\x69\x26\xcb\xda\x0c\xe2\x2f\xe8\xf6\x01\xdf\xf0\xe0\x80\x41\xd6\x92\xf8\x08\x56\x90\x45\xf7\x93\x37\xee\x33\x0a\x39\xc3\xfb\x3e\xe9\x0a\x64\x9c\x1b\x8f\x34\x27\xd4\xd8\x1a\x1f\xa1\xbe\x8b\x98\x06\xe7\xe6\x86\xe2\x47\xbb\xe2\xe9\xf5\xcc\x52\xf4\xc0\xe2\xcc\x72\x67\x77\x0d\x8c\xd8\x60\x60\x04\x32\x47\x6d\xe3\x19\x5c\x28\xf1\x27\xbe\x52\x8c\x81\x9d\xb8\x4b\xb7\x51\x28\x61\x06\xbe\x8b\x1e\x1f\x76\x2f\x99\x74\x70\xd6\x14\x3d\x76\xc0\xfe\x0e\x14\xe6\x7e\x42\xeb\xfe\x6c\x74\x84\x83\x39\xe2\xf4\xae\xcb\xde\x90\x39\x25\x6f\xab\x64\x6a\x94\x25\x85\xb7\x7a\x90\xca\x69\xe6\xda\xf7\x8c\x6d\xbe\x95\x2e\x3b\x18\x83\xcc\xba\xc6\xb6\xe4\x6d\x8d\xed\x9d\x3a\x6c\xb5\x47\x93\xc8\x49\xfb\x44\x31\x35\x99\x30\xa3\xac\x0f\x9d\x5e\xda\x6a\xee\x3e\xc5\x6a\xa8\x62\xed\x13\x3d\xc5\xea\xfa\x67\xf9\x0e\x00\x00\xff\xff\x80\xe8\x34\xd0\x6a\x03\x00\x00") +var _outputsTf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x93\xbb\x6e\xeb\x30\x0c\x86\x77\x3f\x85\x90\xf1\x0c\x5e\x32\x9f\xa1\xe8\xd0\xa1\x40\x87\x64\x2c\x0a\x81\x96\x88\x44\xb1\x22\x19\x24\x95\x56\x28\xfa\xee\x85\x6f\x6d\x2e\xaa\xe3\xc5\x80\x7f\x7e\x9f\x48\xda\x8e\x49\xba\x24\x6a\xe5\x02\x0b\x04\x83\xbc\x52\x9f\x95\x52\x27\xf0\x09\xd5\x7f\x05\xef\xac\xe7\xa8\x86\xae\xd3\x8c\x74\x42\x7a\xfd\xf7\x56\x7d\x55\xd5\x0c\xdb\xe6\xd1\x27\x16\xa4\x5b\x98\x2c\x6b\x33\x86\xbf\xa2\xeb\x07\x7c\xe5\x83\x1d\x06\x59\xea\xc4\x47\xb0\x82\x2c\x7a\xa8\xbc\xa2\x8f\x28\xe4\x0c\x6f\x87\x4e\x17\x24\x53\xdd\x34\xd2\xb9\xa1\xc5\x6c\x7c\x84\xf6\xae\x62\x2e\x2c\x38\x3a\x8a\x1f\x79\x01\x1d\xf2\x02\x87\x1e\x58\x9c\xb9\x3d\xba\xbf\x46\x47\xec\x30\x30\x02\x99\xbd\xb6\xf1\x08\x2e\xd4\xf8\x33\x85\x52\x8c\x81\x9d\xb8\x53\x7f\xa2\x50\xc2\x82\x7c\x13\x3d\x3e\x6c\x5e\x0a\xdd\xc1\x51\x53\xf4\xd8\x0b\x87\x3b\x50\x38\xe7\x09\xad\xfb\x73\xb1\x93\x1c\xcc\x1e\xe7\x57\x5e\x0f\x40\x61\x4a\x5e\x37\xc9\xb4\x28\xb7\x16\x5e\xeb\x31\xaa\xe7\x9a\x4b\xee\x19\x73\x79\x2b\x7d\xef\x60\x0c\x32\xeb\x16\x73\xcd\xeb\x16\xf3\x9d\x75\xd8\x66\x8b\x26\x91\x93\xfc\x44\x31\x75\x85\x66\xa6\x58\xef\xfa\xbc\xb6\xcd\x39\x7d\x88\xcd\xb8\x8a\xa5\x2f\xf5\x10\x9b\x8b\x7f\xe6\x3b\x00\x00\xff\xff\x64\xa0\xb3\xd2\x70\x03\x00\x00") func outputsTfBytes() ([]byte, error) { return bindataRead( @@ -304,11 +304,11 @@ func outputsTf() (*asset, error) { } info := bindataFileInfo{name: "outputs.tf", size: 0, mode: os.FileMode(0644), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x28, 0xdd, 0xa5, 0x5e, 0xe, 0x77, 0x91, 0x9c, 0xf2, 0x10, 0xba, 0x26, 0x7a, 0x0, 0xa3, 0x6a, 0x3, 0xfa, 0x31, 0xde, 0x61, 0xb2, 0xb6, 0x84, 0xd5, 0x38, 0x34, 0xa7, 0x8, 0xa0, 0x2, 0xa3}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x72, 0x7e, 0x72, 0x1b, 0x3a, 0xcd, 0x37, 0x83, 0x72, 0xfd, 0xe5, 0x4c, 0x1f, 0xf8, 0xa7, 0xbf, 0x5, 0xee, 0x44, 0x3a, 0x97, 0x92, 0x58, 0xa0, 0x1a, 0x75, 0xa7, 0x47, 0x7a, 0xeb, 0xe1, 0x9e}} return a, nil } -var _provisionersAgentSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x94\xcf\x6f\xeb\x36\x0c\xc7\xef\xfe\x2b\xd8\xa4\x68\x92\xad\xb2\x92\xb6\xd8\xa1\x45\x0f\x3d\x0d\xbb\x6c\xc0\xb0\x61\x87\xae\x28\x64\x8b\xb1\x85\xca\xa2\x20\x52\xf9\x81\x61\xff\xfb\x20\x27\xcb\x43\x83\x1c\x1e\x1e\x9e\x2f\x12\x2d\xea\xf3\xa5\x48\x89\xd3\x2b\xdd\xb8\xa0\x1b\xc3\x7d\x55\x31\x0a\x28\xcc\x04\xd1\x45\x5c\x1b\xe7\xab\x6a\x0a\x7f\x19\x27\xb0\xa6\x04\x0d\x91\x80\x10\x34\x08\x6b\x17\x1c\xf7\x68\x61\x8e\x75\x57\x43\x40\xd9\x52\xfa\x70\xa1\x3b\xae\xe7\xb8\xa8\xab\x6d\xef\x3c\xc2\x2b\x5c\x81\x5a\x83\xde\x98\xa4\xbd\x6b\x74\xeb\x29\x5b\xed\x02\x8b\x09\x2d\xea\x02\x55\x27\xdc\xdb\x13\x58\x02\x6c\x7b\x82\x59\xd1\x2d\xc4\x22\x3d\x6e\x52\x2e\x38\xa9\xeb\x7a\xf6\x04\xec\x11\x23\xac\x8a\x77\xc0\x12\xe4\xef\x28\x69\x0f\x9e\x28\xc2\x3c\xc7\x12\xc5\x3d\x88\x1b\x90\x17\x55\x78\x5e\x56\x39\x88\xf3\xf0\x0a\x93\xeb\x30\x01\xd5\x21\xdc\xc3\x5b\x65\xa9\x82\xe3\x37\x85\x5f\x49\xf0\x11\x5a\x1a\x06\x13\x2c\x43\x83\x9e\xb6\x60\x12\x02\xee\x22\xb6\x82\xf6\x78\x32\x74\xd2\x63\x02\x67\x71\x88\x24\x18\x04\x28\x41\x87\x01\x93\xf1\x7e\x0f\x6c\xd6\x78\xf4\x4c\x39\xc0\x40\x09\x41\x7a\x13\x80\x42\x8b\xf5\x49\x6f\x3c\xe1\xe4\x45\x04\x87\x28\x70\xfd\x4f\xf8\x77\x72\x5a\xe3\x6c\x09\x4c\x14\xd5\x95\x6a\xec\x21\x47\x6b\x04\xe1\xe6\x06\xfe\xbe\xec\x33\xe6\xd2\xfb\xe2\x1b\x13\x0d\x28\x3d\x66\x56\x81\x2c\x2a\xdc\x45\x4a\x82\xe9\xeb\x76\x87\x3c\x98\x56\x3c\x78\x17\xf2\x4e\x09\x91\x67\x65\xb6\x7c\x6e\x2b\x2f\xac\xee\xee\xea\xe5\xc3\x67\xec\x14\x7e\x39\xb2\x7e\x8b\x18\xfe\x40\x8f\xc3\x58\x95\x96\xbc\xc7\x56\x28\xdd\x42\xe6\x52\xd1\xdc\xe4\x20\x19\x32\x63\x2a\xb9\x32\x1b\x72\x16\x22\xa6\xc1\x31\x3b\x0a\xe0\x98\x33\xf2\x89\xbb\x2d\x61\xf6\x22\x91\x1f\xb5\xee\x9c\xf4\xb9\xa9\x5b\x1a\x34\x45\x0c\x4a\xfe\x97\x19\xcd\x93\xa5\x4e\xa2\x2a\xa1\x47\xc3\xc8\xfa\x34\xb1\xb4\x0d\x9e\x8c\xd5\x9b\x65\xbd\x5a\x2d\xeb\xa5\x26\x41\xdf\x92\x57\x2d\x05\x49\xae\x79\x3f\xfe\x7f\x1f\x4f\xfe\x6e\x06\xfb\xd3\x43\x6d\xb1\xb9\x90\x46\x1b\x3f\x3a\x50\x0e\xbe\x9d\xc0\x68\x0b\x60\xc6\xfa\x4f\xc6\xf4\x5c\xff\x70\x18\x0f\x49\xd2\xdd\x0c\xc6\x67\xc3\x7b\x16\x1c\xec\x71\x3c\x0f\xb8\x66\x4c\x1b\xd7\x5e\xba\x25\x5f\xf0\x3f\x27\xca\xb1\xf0\x0f\x93\xef\x25\x30\x7c\x58\x97\x40\x45\xd0\x28\xed\xf9\xbe\x4b\x01\x8d\x02\xe5\x9e\x59\x83\x03\x85\x52\x20\x32\xb6\x78\x9e\xad\x27\x64\x31\x49\xce\x73\xfb\x99\x89\x3b\x27\xb0\x2c\x66\x78\xbe\x9e\xcf\xc3\x8f\xab\xc5\xa2\x58\x87\x16\x71\x57\x1d\x3a\xc4\xa1\xa5\xbc\xf8\x02\x2d\x77\xd2\x1c\x9e\x1e\x43\x6f\x36\x08\xa5\xd5\xa1\xbd\x1d\x59\x2e\x74\xb3\xa2\x30\x72\x57\xd5\x7f\x01\x00\x00\xff\xff\x5d\x66\xff\x5d\x20\x05\x00\x00") +var _provisionersAgentSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x55\x51\x6f\xdb\x36\x10\x7e\xe7\xaf\xb8\x2a\x46\x63\x6f\x93\x18\xb7\x45\x50\xb4\xf0\x43\x31\x0c\xc3\x5e\xba\x61\xd8\xb0\x87\xae\x10\x68\xf1\x24\x11\xa5\xee\x04\xf2\x64\x3b\x0d\xfc\xdf\x07\x4a\x8e\x17\x07\xf1\x32\xa0\xf1\x8b\x4c\xf1\xbb\xef\xd3\x7d\x77\x3c\x5e\xbc\xd0\x6b\x47\x7a\x6d\x62\xab\x54\x44\x81\x1c\x07\x86\xde\xf5\x58\x1b\xe7\x95\xba\x80\xbf\x8c\x13\xa8\x39\xc0\x9a\x59\x40\x18\xd6\x08\xb5\x23\x17\x5b\xb4\x30\xc7\xa2\x29\x80\x50\xb6\x1c\xbe\x38\x6a\x0e\xfb\x43\xbf\x28\xd4\xb6\x75\x1e\xe1\x13\xbc\x80\xbc\x06\xbd\x31\x41\x7b\xb7\xd6\x95\xe7\xc1\x6a\x47\x51\x0c\x55\xa8\x13\x69\x7e\xa4\xfb\xfc\x1e\x2c\x03\x56\x2d\xc3\x65\xd2\x4d\x8c\x49\x7a\x0c\xca\x1d\x39\x29\x8a\xe2\xf2\x3d\x44\x8f\xd8\xc3\x32\xa1\x09\x95\x8a\x37\x51\xb0\x2b\x4d\xa8\xda\xd5\x6c\x3e\x90\xe9\x10\xf2\x6e\xa1\x5c\x0d\x9f\x20\x9b\xdd\xdb\xce\x60\xb5\x82\x6c\xf7\xf6\xba\xbc\x7e\x93\x25\x39\x69\x91\x14\xc0\x18\x9a\x99\xce\x5e\xbf\xc9\x54\xed\x54\x1f\xb8\x43\x69\x71\x88\x25\xb1\xc5\x12\x77\x3d\x07\xc1\x50\x6e\x30\x44\xc7\xb4\xca\x96\xc5\xdb\xe2\x55\xa6\x58\xd0\x97\x15\x7b\x8f\x95\xf0\xbd\xed\xab\x62\xb9\xbc\x2a\xae\x32\xa5\xea\x81\x2a\x71\x4c\x30\xe6\xec\x7d\x79\x8e\x7b\xbe\x80\x5b\x05\x00\x53\xfe\xd9\x2f\x13\x3c\x59\xf0\xdb\x31\x02\x3e\xb2\x45\xf8\xe9\x10\x91\x8d\xf0\x6d\x83\x02\xad\x48\x1f\xdf\x69\xdd\x38\x69\x87\x75\x51\x71\xa7\xff\xd5\xd1\x27\x3a\x3a\xa0\x47\x13\x31\x6a\xcb\x5b\xf2\x6c\xac\xde\xcc\x6e\x9f\xca\x78\x7f\x4a\x92\xff\x8f\x88\xc2\x3b\x1a\x76\xf9\xec\x36\xb9\xbb\x2f\xc4\x84\xa2\xf9\x0a\x2f\x5f\xc2\xdf\xe3\x77\x8b\x09\xb0\xdb\xd4\x5f\xe1\xb9\x89\xe3\x60\x19\xaa\xfe\x5b\x79\x4f\x13\x06\x3d\xc4\xa0\x3d\x57\xc6\xa7\x13\xa3\xf6\x8f\x54\xf6\xb4\x19\xce\xd7\xf3\xd7\x1e\xe9\x0f\xf4\xd8\xa1\x84\x1b\xf8\xf1\x2e\xe0\xbf\xcb\xc9\x3d\x52\x2e\x77\x51\xe3\xf2\xb8\xca\x8f\xa2\xf9\xb1\xb8\x8f\x56\xf9\xf1\x76\xdd\xeb\xf4\xbe\x62\x9f\x57\x4c\x12\xdc\xba\x3c\x8b\x2c\x47\x8b\xca\x3b\xeb\x43\xdf\x3d\xf0\x3d\xbd\xc9\x1d\x3c\x1f\x61\x44\x9b\x08\xb3\xa8\xff\x8c\x18\x56\xc5\x77\xd3\x73\x36\xdf\xb6\x6c\x3a\xb7\xd0\x4d\x06\xe3\x64\x99\x8e\xb9\x3d\x3c\x1f\xa6\x54\x44\x0c\x1b\x57\xe1\x59\xf6\x9f\x03\x0f\x7d\xa2\x9f\xfe\x3c\x17\xff\x08\xae\xc4\x83\x35\xd8\x31\xa5\xfa\xb0\xb1\x67\x51\x01\xa3\x98\x20\x0f\xfd\x4b\xed\x76\x01\xbf\x8f\xfd\xe2\x99\x7b\x98\x0f\x7d\x9a\xb5\xaf\x41\x5c\x87\x71\xa1\x68\x75\xa5\x06\x12\xe7\xc7\x89\x47\x19\xe4\x0d\xc2\x6b\xf8\xac\x2c\x8f\x32\xe9\x77\x01\x1f\x59\xf0\x1d\x54\xdc\x75\x86\x6c\x84\x35\x7a\xde\x82\x09\x08\xb8\xeb\xb1\x12\xb4\x87\xf9\x8d\x4e\x5a\x0c\xe0\x2c\x76\x3d\x0b\x92\x00\x07\x68\x90\x30\x18\xef\x6f\x20\x9a\x1a\x0f\xc8\x30\x10\x74\x1c\x10\xa4\x35\x04\x4c\x15\x16\x47\xbd\xa9\xef\x3f\x88\x60\xd7\x0b\xcc\x6e\x69\x9f\x1d\xf7\xc6\xb4\x2d\xd5\x90\xdf\xc0\xd0\x5b\x23\xf7\x8c\x7b\xb8\x7f\x38\x5e\x40\x43\x67\x92\x47\x5f\x30\x10\xfa\x5c\x98\x7d\x7c\x3a\x6a\x3c\x4f\x27\xa8\xa7\x06\xf1\xe3\xe8\xd3\xfe\x3d\xc5\xe0\xce\x09\x5c\xa5\x25\xad\x66\xf3\x39\x7d\xbf\x5c\x2c\xd2\x6a\xba\xa7\x5e\xa9\xe9\x9a\x9a\xee\xb5\x0f\x3e\x55\x39\x15\xd2\x4c\xce\x44\x68\xcd\x06\x21\xdd\xb7\x68\x7f\x18\xb9\x1c\x35\x97\x49\x61\xe4\x5d\xaa\x7f\x02\x00\x00\xff\xff\x15\x12\x0e\x9c\xa5\x07\x00\x00") func provisionersAgentShBytes() ([]byte, error) { return bindataRead( @@ -324,11 +324,11 @@ func provisionersAgentSh() (*asset, error) { } info := bindataFileInfo{name: "provisioners/agent.sh", size: 0, mode: os.FileMode(0644), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8b, 0xe5, 0x1d, 0xf5, 0x1, 0x45, 0x69, 0x1c, 0xb, 0xa8, 0x30, 0xc3, 0x4b, 0x96, 0xa5, 0x21, 0x3c, 0x13, 0x43, 0x83, 0x19, 0x6d, 0xd3, 0xa4, 0xc4, 0x2a, 0x13, 0x5e, 0x7b, 0xe1, 0x15, 0xa}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd4, 0xa6, 0x6b, 0x6, 0xe5, 0xce, 0x1e, 0xa5, 0xc3, 0xe9, 0xa1, 0xda, 0x5b, 0x8c, 0x52, 0x93, 0x8b, 0xc5, 0x3b, 0x9a, 0x5c, 0xcb, 0x3e, 0x18, 0xb4, 0xdb, 0xad, 0x69, 0x21, 0x43, 0x3f, 0x76}} return a, nil } -var _provisionersAppSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x55\x6f\x6f\x1b\xb7\x0f\x7e\xef\x4f\xc1\xa6\x41\x9d\xb4\xd5\xc9\x4e\xfd\xfb\xa1\x48\x91\x01\x41\x80\x0d\x7b\xb3\x02\xc3\x86\xbd\x48\x83\x40\x77\x62\xee\x84\xe8\x44\x45\xa4\xec\x18\xeb\xbe\xfb\xa0\xbb\x8b\x13\x38\xfb\x93\x0d\xf3\x9b\x13\xcd\xe7\x79\x44\x52\x14\xf5\xfa\x95\xae\x5d\xd0\xb5\xe1\x6e\x36\x63\x14\x50\x98\x09\xa2\x8b\x78\x63\x9c\x9f\xcd\x5e\xc3\x2f\xc6\x09\xdc\x50\x82\x9a\x48\x40\x08\x6a\x84\x1b\x17\x1c\x77\x68\xe1\x08\xab\xb6\x82\x80\xb2\xa1\x74\xeb\x42\x3b\xf9\x73\x3c\xae\x66\x9b\xce\x79\x84\x4b\x78\x05\xea\x06\xf4\xda\x24\xed\x5d\xad\x1b\x4f\xd9\x6a\x17\x58\x4c\x68\x50\x17\x51\xb5\x93\xbb\xfa\x04\x96\x00\x9b\x8e\x60\x5e\xf6\x2d\x8a\x65\xeb\x81\xa4\x5c\x70\x52\x55\xd5\xfc\x13\xb0\x47\x8c\xb0\x2c\xe8\x80\x25\xc8\x1f\x51\xd2\x16\x3c\x51\x84\xa3\x1c\x4b\x14\x1f\x40\x5c\x8f\x7c\x3c\x0b\x67\x8b\x59\x0e\xe2\x3c\x5c\xc2\xc1\x61\x38\x00\xd5\x22\x7c\x80\xab\x99\xa5\x19\x0c\xbf\xd7\xf0\x03\x09\x9e\x42\x43\x7d\x6f\x82\x65\xa8\xd1\xd3\x06\x4c\x42\xc0\xfb\x88\x8d\xa0\x9d\xf2\x42\x27\x1d\x26\x70\x16\xfb\x48\x82\x41\x80\x12\xb4\x18\x30\x19\xef\xb7\xc0\xe6\x06\x27\x64\xca\x01\x7a\x4a\x08\xd2\x99\x00\x14\x1a\xac\xa6\xdd\x86\xec\x0e\xce\x45\xb0\x8f\x02\x87\xbf\x86\xdf\x0e\x9e\x7a\xe6\xd2\xc4\xeb\xba\x4e\x73\xf8\x0a\x9c\x2d\x81\x20\x82\x32\xa0\x51\x1a\xdd\x93\xcd\x1e\x19\xde\xbc\x81\x2f\x13\x69\xc0\xf4\x64\x63\xa2\x1a\x61\x22\x3f\x05\x6c\xda\x72\xaa\x77\x9f\x41\x41\x27\x12\xf9\x54\xeb\xcd\x66\x53\x45\x62\x69\x13\xf2\x9d\xaf\x28\xb5\xba\x47\xeb\x8c\xbe\xc5\x2d\xeb\xf3\x8b\x8b\x8b\xd5\xc5\xb7\x1f\x2b\xc3\x0d\x7c\x85\x36\xb6\xa0\x94\x45\x93\x7a\x4a\x4f\x83\xd2\x99\x93\xe6\xce\x24\x2c\xbc\xe4\x42\xcb\xfa\x41\x55\x99\xd4\x74\x6e\x8d\x6a\xf2\x54\x45\x65\x3f\x6a\xee\x40\x35\x30\x1f\x0b\x62\xb1\x86\x4b\x76\x6d\x40\xab\xea\xed\xd9\x3f\x15\xbf\x1a\x92\x3b\xd5\xda\x44\xd9\xcf\x2d\xe6\x5a\x27\x8c\xc4\xc5\x09\x87\x47\x9e\xeb\xeb\x84\x1e\x0d\x23\xa8\x86\x8f\x55\x6c\x6d\x0b\xbd\x71\xe1\x00\xbe\x19\x0b\x6d\xa2\x68\xa6\x9c\x1a\xe4\xca\x3b\x96\xca\xea\x02\x1a\xd6\xf3\x67\x89\x98\x28\x6a\xa8\xf2\x16\x72\xb4\x46\xf0\x4f\x11\x43\xdf\x7b\x5f\x90\xfd\x96\xef\xbc\x6a\xbc\xc3\x20\xea\x63\xb5\x78\x09\xe7\x31\xb1\x07\xe2\x72\xf5\x22\x5e\xa2\x1e\xa5\xc3\xcc\x2a\x90\x45\x85\xf7\x91\x92\x60\x7a\x09\x37\xe4\xde\x34\xe2\xc1\xbb\x90\xef\x95\x10\x79\x56\x66\xc3\xfb\xb6\xf2\xc2\xea\xe4\xa4\x5a\xac\x9e\x35\xdf\x43\xdb\xb5\x4e\xba\x5c\x57\x0d\xf5\x9a\x25\xa1\xe9\x31\xad\xfe\xa7\x03\x4a\x44\xbc\xd5\xd3\x89\xb0\xb6\xb4\x09\x9e\x8c\xd5\xeb\x45\xb5\xac\x56\x0f\x00\x35\x9a\xcf\x7b\x7f\x0d\x3b\xc4\xdb\xb1\x29\x3d\x35\xc6\x0f\x73\x6d\xf2\x14\xd2\x00\x6e\xba\x9e\x2c\xbc\xbb\xff\x0b\xdc\x97\xdd\x54\xf8\x7e\x2a\xc2\xe7\x88\xe1\x27\xf4\xd8\x0f\x43\xa6\x21\xef\xb1\x11\x4a\xef\x21\x73\x19\x50\xb9\xce\x41\x32\x64\xc6\x54\x2e\xbf\x59\x93\xb3\x10\x31\xf5\x8e\xd9\x51\x00\xc7\x9c\x91\xff\xa6\x20\x14\x31\x28\x79\xd8\x64\x30\x77\x96\xda\x6d\xa9\x76\x45\xfa\xe3\x6a\x2d\x17\xd5\x42\x93\xa0\x6f\xc8\xab\x86\x82\x24\x57\x5f\x4f\xff\x5f\x0f\x07\x76\x6d\x7a\xfb\xff\x55\x55\x6e\xdb\x7e\x21\x6d\xbc\x6d\x41\x39\xf8\xb7\x7c\x46\x5b\xe8\x73\xd6\x3f\x33\xa6\xb3\xea\xed\xf8\x1d\xcb\xa3\xdb\x39\x0c\xf3\x9f\xb7\x2c\xd8\xdb\xe9\xbb\x1f\x6c\xc5\x98\xd6\xae\x79\x7e\x81\x1e\xc5\xbf\x4b\x94\x63\x51\x1f\x17\xff\x8d\x7c\x7f\x6b\x5d\x02\x15\xc7\xdb\xbf\xc7\x7a\x1e\xcc\x20\x5e\x2e\x85\x35\xd8\x53\x28\xc7\x42\xc6\xee\xba\xec\xd1\x9f\x90\xc5\x24\xd9\xaf\xe9\x53\x45\xbc\x77\x02\x8b\x62\x84\xb3\xc3\xa3\xa3\xf0\x6e\x79\x7c\x5c\xac\xf1\x8d\x3b\x99\x8d\x4f\xdc\xf8\x36\x9c\xfb\x22\x59\xba\xd0\x8c\xef\x07\x43\x67\xd6\x08\xe5\xad\x46\xfb\x7e\xd0\x72\xa1\x1d\x26\xd4\xa0\xbb\x9c\xfd\x1e\x00\x00\xff\xff\x1f\x9c\x42\x87\xe1\x07\x00\x00") +var _provisionersAppSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x56\x5f\x6f\xdb\x36\x10\x7f\xd7\xa7\xb8\x2a\x46\x63\xb7\xa3\x18\xb7\x59\xd1\xb5\xf0\x43\x31\x14\xc3\x80\xa1\x1b\x86\x0d\x7b\xe8\x0a\x83\x12\xcf\x12\x51\x8a\xc7\x92\x27\xdb\x69\xe6\xef\x3e\x50\xfe\x17\x3b\xf6\x52\x60\x79\x92\x48\xfe\xee\x77\xbc\xff\xbc\x78\x22\x4b\xe3\x64\xa9\x62\x93\x65\x11\x19\x04\x76\x04\xde\x78\x9c\x29\x63\xb3\xec\x02\xfe\x52\x86\x61\x46\x01\x4a\x22\x06\x26\x28\x11\x66\xc6\x99\xd8\xa0\x86\x21\x16\x75\x01\x0e\x79\x41\xe1\xb3\x71\xf5\xe6\xbc\xf3\xa3\x22\x5b\x34\xc6\x22\x7c\x84\x27\x20\x66\x20\xe7\x2a\x48\x6b\x4a\x59\x59\xea\xb4\x34\x2e\xb2\x72\x15\xca\x44\x2a\x76\x74\x9f\xde\x82\x26\xc0\xaa\x21\xb8\x4c\x7a\x13\x63\x52\xdd\x0b\x09\xe3\x0c\x17\x45\x71\xf9\x16\xa2\x45\xf4\x30\x4e\x68\x87\x59\x16\x6f\x22\x63\x3b\x55\xa1\x6a\x26\x83\x61\xe7\x54\x8b\x20\xda\x51\x66\x66\xf0\x11\xf2\xc1\x9d\xe3\x1c\x26\x13\xc8\x97\xaf\x5f\x4d\x5f\x5d\xe7\x49\x1d\x37\xe8\x32\x80\x5e\x34\x57\xad\x7e\x75\x9d\x67\x33\x93\x79\x8a\x5c\x07\x8c\x5f\xec\x74\x8e\x21\x1a\x72\x93\x7c\x7c\x9d\x67\x3e\x50\x8b\xdc\x60\x17\xa7\x8e\x34\x4e\x71\xe9\x29\x30\x86\x3b\xa8\xe2\x75\xf1\x22\xcf\x1c\xb2\x47\xfc\xbc\xdf\xbf\x2a\xc6\xc5\x75\x9e\x11\xa3\x9d\x56\x64\x2d\x56\x4c\xe1\xe0\x78\x7c\x55\x5c\xe5\x59\x36\xeb\x5c\xc5\x86\x1c\xf4\x3e\xb2\x76\x7a\x4e\xe7\x70\x04\xb7\x19\x00\xac\xfd\x95\xff\xbc\x86\x27\x97\xfd\xb6\x93\x80\x0f\xa4\x11\xde\x6f\x24\xf2\x1e\xbe\xa8\x91\xa1\x61\xf6\xf1\x8d\x94\xb5\xe1\xa6\x2b\x8b\x8a\x5a\xb9\xd7\x23\x0f\xf4\xc8\x80\x16\x55\xc4\x28\x35\x2d\x9c\x25\xa5\xe5\x7c\x70\xfb\x90\x27\x56\x87\x24\xe2\x1b\x24\x0a\x6b\x5c\xb7\x14\x83\xdb\x14\x8d\x55\xc1\x2a\x14\xf5\x57\x78\xfa\x14\xfe\xee\xef\xcd\x2a\xc0\x72\x3e\xfb\x0a\x8f\x4d\x1c\x3b\x4d\x50\xf9\xff\xcb\x7b\x68\x30\xc8\x2e\x06\x69\xa9\x52\x36\x55\x58\xb6\x3a\x11\xd9\xc3\x64\x38\x1f\xcf\x5f\x3d\xba\x3f\xd0\x62\x8b\x1c\x6e\xe0\xc7\xad\xc0\x7f\x87\x93\x3c\x3a\xc1\x5b\xa9\x7e\xb9\x5b\x89\x9d\x52\xb1\x0b\xee\xc9\x28\x9f\x4e\xd7\x95\x4c\xfb\x15\x59\x51\x91\xe3\x60\xca\xe9\x59\xe4\xb4\x77\xd1\x74\xeb\xfa\xe0\xdb\x23\xbf\xa7\x1d\x61\xe0\xf1\x08\x23\xea\x44\x98\x47\xf9\x67\xc4\x30\x29\x9e\xad\xbf\x83\xe1\xa2\x21\xd5\x9a\x91\xac\x73\xe8\x3b\xd1\xba\x2d\xe8\xcd\xf7\xd8\xa4\x22\x62\x98\x9b\x0a\xcf\xb2\xff\x14\xa8\xf3\x89\x7e\xfd\xf3\x58\xfc\x3d\xb8\x62\x0b\x5a\x61\x4b\x2e\xc5\x87\x94\x3e\x8b\x0a\x18\x59\x05\x3e\xf6\xdf\xc9\x74\xdb\xf4\xa4\x5d\x9e\x9d\xcb\x9c\xc8\x01\x55\x8b\xe1\xfa\x7b\xb9\x11\x39\x9d\x1c\x47\x3d\x6e\xb5\x45\x8b\x13\x67\x47\x06\xb4\x73\xd8\x81\x9f\x1d\x95\xca\x96\xe6\xb8\x40\x9b\x96\x34\x3c\x5f\x9e\x41\x27\x8b\x2f\xe0\xf7\xbe\x42\x2c\x91\x87\x61\xe7\xd3\x34\x7a\x09\x6c\x5a\x8c\xa3\xcc\x4d\xae\xb2\xce\xb1\xb1\xfd\x4c\x70\x39\x88\x1a\xe1\x25\x7c\xca\x34\xf5\x4a\x00\x2e\xe0\x03\x31\xbe\x81\x8a\xda\x56\x39\x1d\xa1\x44\x4b\x0b\x50\x01\x01\x97\x1e\x2b\x46\xbd\x99\x6f\x68\xb8\xc1\x00\x46\x63\xeb\x89\xd1\x31\x50\x80\x1a\x1d\x06\x65\xed\x0d\x44\x35\xc3\x0d\x32\x74\x0e\x5a\x0a\x08\xdc\x28\x07\xe4\x2a\x2c\x36\xda\xd6\x55\xfe\x8e\x19\x5b\xcf\x30\xb8\x75\xab\xfc\xee\xc9\x25\x57\x7e\x5a\x96\xe1\x12\xfe\x59\xdb\xcf\x88\x20\x14\x48\xe4\x4a\xb6\xa4\x3b\x8b\x51\xa4\x48\x14\x5a\x6e\xa0\x45\x45\x6e\xb6\xf7\xda\xd6\xd5\xa4\x7d\xa0\x12\x61\x83\xba\x07\xd0\x6e\x06\xe2\x66\x9b\x25\xbb\x84\xd8\x46\xba\xd8\xcf\xc2\x82\x42\x2d\x7d\x57\xca\x80\x9e\xa2\xbc\xe9\xda\xfe\x2f\xf8\x36\xca\xf7\xbf\x88\x1f\xc4\x7a\xb0\x4a\x5f\xeb\x5a\x04\xd4\x8d\x62\x91\x00\xc2\x2a\xc6\xc8\x85\xa3\x54\xb4\x87\x35\x7b\xfa\x12\x7b\x9d\x83\xdb\xfb\xb3\x78\x25\x52\xf1\xe0\x7d\x53\xfa\xd4\xf0\x75\xfc\x62\xc5\x49\xb9\x3e\x61\xf6\xfb\xa7\x41\x22\x22\x77\x1e\xd2\x6b\x43\x97\xf7\x54\xec\x4b\x0f\x9d\x2a\x2d\x82\x10\x8e\x16\xf0\x10\xe9\x43\x06\xf7\xb5\xf8\xcd\x4e\x19\x5f\x3f\x84\x75\x5d\xab\xd2\x25\x3f\x63\x70\x68\x05\x13\xd9\x78\x57\xe6\xa8\x27\x9c\x3a\x3a\x37\xfe\x4e\x61\x0f\x9b\xf5\x5d\x04\x2e\x0d\xc3\x55\x5a\xb8\xc9\x60\x38\x74\xcf\xc7\xa3\x51\x5a\xad\x9f\x70\x2f\xb2\xf5\x0b\x6e\x9d\xf2\xef\x6c\x6a\x68\xa9\x82\xd5\xba\x2c\x22\x34\x6a\x8e\x90\x9e\xa2\xa8\xbf\xeb\xb9\x8c\xab\x2f\x13\x7f\xcf\x3b\xce\xfe\x0d\x00\x00\xff\xff\x37\xf3\x37\x0b\xc0\x0a\x00\x00") func provisionersAppShBytes() ([]byte, error) { return bindataRead( @@ -344,11 +344,11 @@ func provisionersAppSh() (*asset, error) { } info := bindataFileInfo{name: "provisioners/app.sh", size: 0, mode: os.FileMode(0644), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa0, 0x73, 0x90, 0x28, 0x7d, 0x7e, 0x83, 0xec, 0x71, 0x73, 0x55, 0xc7, 0x78, 0x5d, 0x68, 0xeb, 0xb5, 0xba, 0x1c, 0x2e, 0xef, 0x68, 0x2f, 0x6c, 0x26, 0xce, 0xf7, 0x73, 0x7e, 0x21, 0xdc, 0x94}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x73, 0x2f, 0x88, 0xfb, 0x33, 0xf7, 0x9f, 0xf7, 0x33, 0x1d, 0xf9, 0x70, 0x14, 0x87, 0xd0, 0xe4, 0xca, 0x21, 0xf5, 0xfc, 0xce, 0xb7, 0xd3, 0xaf, 0xcf, 0x4e, 0x28, 0xf6, 0xb1, 0xf8, 0xf, 0x34}} return a, nil } -var _provisionersJobSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x53\xc1\x6a\x23\x39\x10\xbd\xf7\x57\xbc\x38\x26\xb6\xd9\x55\x2b\xde\xe4\x10\x12\xb2\x10\x0c\x7b\xdc\x85\xbd\xec\x21\x1b\x06\x75\xab\xdc\x2d\xa2\x96\x14\x55\x75\x1c\x33\x99\x7f\x1f\xd4\x76\x66\x86\x19\x06\x32\x7d\x6a\x51\xef\xbd\xaa\x57\xd4\x3b\x3d\xd1\x8d\x0b\xba\x31\xdc\x57\x15\x93\x40\xd1\x18\x91\x5c\xa2\xad\x71\xbe\xaa\x4e\xf1\x9f\x71\x82\x6d\xcc\x68\x62\x14\x48\x44\x43\xd8\xba\xe0\xb8\x27\x8b\x25\xd5\x5d\x8d\x40\xb2\x8b\xf9\xd1\x85\xee\x58\x1f\xd3\xaa\xae\x76\xbd\xf3\x84\x7b\x9c\x40\x6d\xa1\x9f\x4d\xd6\xde\x35\xba\xf5\x71\xb4\xda\x05\x16\x13\x5a\xd2\x45\x54\x7d\x91\x7b\xb8\x81\x8d\xa0\xb6\x8f\x58\x94\xbe\x45\xb1\xb4\x9e\x48\xca\x05\x27\x75\x5d\x2f\x6e\xc0\x9e\x28\x61\x5d\xd0\x81\xca\x90\xff\x92\xe4\x3d\x7c\x8c\x09\xcb\x31\x95\x29\x2e\x20\x6e\x20\x5e\x55\xe1\xf6\xbc\x1a\x83\x38\x8f\x7b\xcc\xe6\x61\x06\xd5\x11\x2e\xf0\x50\xd9\x58\x61\xfa\x4e\xf1\x77\x14\xba\x46\x1b\x87\xc1\x04\xcb\x68\xc8\xc7\x1d\x4c\x26\xd0\x4b\xa2\x56\xc8\x1e\x7d\x91\x93\x9e\x32\x9c\xa5\x21\x45\xa1\x20\x88\x19\x1d\x05\xca\xc6\xfb\x3d\xd8\x6c\xe9\x88\xcc\x63\xc0\x10\x33\x41\x7a\x13\x10\x43\x4b\xf5\xb1\xdb\xe4\x6e\x76\x27\x42\x43\x12\xcc\x3f\x86\x4f\xb3\x63\x65\xd7\x95\xfd\x3f\xfd\x03\x85\x5e\x24\xf1\xb5\xd6\xbb\xdd\xae\x4e\x91\xa5\xcb\xc4\x4f\xbe\x8e\xb9\xd3\x03\x59\x67\xf4\x23\xed\x59\xdf\x6d\x36\x9b\xcb\xcd\x5f\x57\xb5\xe1\x16\xaf\xe8\x52\x07\xa5\x2c\x99\x3c\xc4\x8c\x57\xf0\x68\x23\x84\x08\x7a\xe4\xac\xb9\x37\x99\x0a\x2f\xbb\xd0\xb1\x7e\x53\x55\x26\xb7\xbd\x7b\x26\x75\xac\xd4\x45\xe5\xec\x0c\xff\x1f\x87\x9a\x44\xb8\x87\x6a\xb1\x38\x8c\x6e\xa9\xc1\x3d\xbb\x2e\x90\x55\xcd\xfe\xf6\x57\xc5\x1f\x26\x73\xd7\x5a\x9b\x24\xdf\x7b\x4b\x63\xa3\x33\xa5\xc8\xa5\x88\xf9\xd2\x73\xf3\x21\x93\x27\xc3\x04\xd5\xf2\x4a\xa5\xce\x76\x18\x8c\x0b\x33\xfc\x09\x4d\xd2\x16\xa0\xe6\x38\xe6\x96\xb8\xf6\x8e\xa5\xb6\xba\x80\xa6\xff\xc5\x0f\x46\x4c\x12\x35\x6d\x79\x8f\x31\x59\x23\xf4\x53\xc4\x74\xa1\xde\x17\xe4\xb0\xe7\x27\xaf\x5a\xef\x28\x88\xba\xaa\xcf\xdf\xc3\xf9\x6a\xec\x8d\xb8\xbe\x7c\x17\x2f\xc7\x81\xa4\xa7\x91\x55\x88\x96\x14\xbd\xa4\x98\x85\xf2\xb7\x5c\x7a\x71\x82\xf3\xf2\x08\xb7\xf3\xe5\x32\xfc\xb6\x5e\xad\x50\x9e\x87\x58\xfc\x51\x1d\x52\x71\x88\xd1\x9d\xf7\xc8\x53\x3a\xcc\xe1\xe4\x18\xbd\x79\x26\x94\x78\x93\xfd\x7d\x12\x73\xa1\x9b\x56\x35\x09\xaf\xab\xcf\x01\x00\x00\xff\xff\x11\x8e\x82\xdf\x14\x04\x00\x00") +var _provisionersJobSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x94\xcd\x6e\xdb\x3a\x10\x85\xf7\x7c\x8a\x13\xc5\x48\x6c\xdc\x2b\x31\x4e\x82\x20\x48\xe0\x45\x5e\xa0\x8b\x6e\xba\x48\x03\x83\x12\x47\x12\x51\x8a\x64\xc9\x91\x7f\x62\xf8\xdd\x0b\xc9\x46\xe3\xa0\x05\x52\xa0\xd5\x8e\x98\x99\xef\x50\x67\x66\x78\x7e\x26\x4b\xe3\x64\xa9\x52\x2b\x44\x22\x46\x4e\xbd\x47\x30\x81\x6a\x65\xac\x10\xe7\xf8\xa2\x0c\xa3\xf6\x11\xa5\xf7\x0c\xf6\x28\x09\xb5\x71\x26\xb5\xa4\x31\xa5\xa2\x29\xe0\x88\xd7\x3e\x7e\x33\xae\x39\xc6\xfb\x30\x2b\xc4\xba\x35\x96\xf0\x8c\x33\xe4\x35\xe4\x4a\x45\x69\x4d\x29\x2b\xeb\x7b\x2d\x8d\x4b\xac\x5c\x45\x72\x80\xe6\x3f\x71\x2f\x8f\xd0\x1e\x54\xb5\x1e\x97\x83\xee\x40\x1c\xa4\xc7\xa2\xdc\x38\xc3\x45\x51\x5c\x3e\x22\x59\xa2\x80\xf9\x90\xed\x48\x88\xb4\x4d\x4c\xdd\x52\xc5\xaa\x5d\x4c\xa6\xbd\x53\x1d\x21\xef\x66\xc2\xd4\x78\x46\x36\x39\x09\x67\x58\x2c\x90\x6d\xee\xef\x96\x77\xb7\xd9\x20\xc7\x2d\x39\x01\x8c\xa5\x99\xea\xf4\xdd\x6d\x26\x6a\x23\x82\x4f\xdc\x44\x4a\xdf\xed\x72\x45\x31\x19\xef\x16\xd9\xfc\x36\x13\x21\xfa\x8e\xb8\xa5\x3e\x2d\x9d\xd7\xb4\xa4\x4d\xf0\x91\x29\x9e\x64\x15\xf7\xc5\x75\x36\x18\xf7\x99\x38\x6e\x61\xbd\x0f\x98\xf6\x61\x70\xe6\x06\x6c\x3a\x4a\x33\xe1\x16\x57\xa2\x77\x6c\xec\x78\x3f\x97\x21\x6f\x08\x37\x78\x11\xda\x0b\x8c\xdf\x39\x3e\x79\xa6\x07\x54\xbe\xeb\x94\xd3\x09\x25\x59\xbf\x86\x8a\x04\xda\x04\xaa\x98\xf4\xd1\x6b\x32\xdc\x52\x84\xd1\xd4\x05\xcf\xe4\x18\x3e\xa2\x21\x47\x51\x59\xbb\x45\x52\x35\x1d\x33\x63\xef\xd0\xf9\x48\xe0\x56\x39\x78\x57\x51\x71\x54\x1b\x1d\xcf\x9e\x98\xa9\x0b\x8c\xc9\xce\xed\xb3\x63\x24\xf5\xda\x43\xbb\x1a\xf9\x16\x7d\xd0\x8a\x09\x17\x17\xf8\xfa\x9b\xe8\xd8\x52\x6b\xf1\x66\xdd\x64\xf7\xab\x8d\xfb\x8f\xca\xd7\x0d\xf1\x69\xce\x78\x6e\x99\x43\x7a\x90\xb2\x31\xdc\xf6\x65\x51\xf9\x4e\xbe\x75\x42\xbe\xeb\x84\x8c\x64\x49\x25\x4a\x52\xfb\xb5\xb3\x5e\x69\xb9\x9a\xec\x3e\xea\xdb\xfe\x3d\x24\xff\x83\x8a\xc2\x1a\xd7\x6f\xf2\xc9\x6e\x98\x9d\x7d\xc1\x2a\x16\xcd\xeb\xe9\xcd\x59\x45\x6c\x56\xf5\x2b\xfe\x3d\x7a\x34\xae\x0a\x7f\x4b\x7e\xff\xd3\x90\x7d\x8a\xd2\xfa\x4a\xd9\xe1\x4d\x38\xd5\xa3\x8d\x61\x5c\x0d\x07\xb7\x98\x4c\xa7\xee\xbf\xf9\x6c\x36\x9c\x0e\x7b\x78\x2d\x0e\x6b\x78\xd8\xdb\x27\x6b\x11\xc7\xd1\x57\x87\x79\x4a\x68\xd5\x8a\x30\xbc\x27\xa4\xff\x1f\x59\xc6\x35\x97\x03\x7f\xe4\xce\xc5\x8f\x00\x00\x00\xff\xff\x8e\x38\x23\x85\x85\x04\x00\x00") func provisionersJobShBytes() ([]byte, error) { return bindataRead( @@ -364,11 +364,11 @@ func provisionersJobSh() (*asset, error) { } info := bindataFileInfo{name: "provisioners/job.sh", size: 0, mode: os.FileMode(0644), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xeb, 0xd2, 0xa7, 0x95, 0xdf, 0x57, 0x59, 0x6d, 0x11, 0xdd, 0xe4, 0x68, 0x41, 0xf5, 0x94, 0xfc, 0xb9, 0x90, 0x8f, 0x57, 0xa2, 0xc3, 0x32, 0x92, 0xf3, 0x16, 0x2e, 0x45, 0xe1, 0x3d, 0xb3, 0xa4}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xff, 0x7, 0xdd, 0x10, 0xbb, 0x8a, 0x34, 0x91, 0x11, 0x27, 0x2, 0x83, 0x9d, 0xc6, 0x3b, 0x29, 0x63, 0x7e, 0xe6, 0x16, 0xf4, 0x51, 0xe6, 0xf5, 0xe0, 0x56, 0x69, 0xea, 0x12, 0x4, 0xf0, 0xb1}} return a, nil } -var _provisionersKeycloakSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x53\x4d\x6f\xdb\x3a\x10\xbc\xeb\x57\x4c\x1c\x23\xb1\xf1\x1e\xa5\xf8\xe5\xf0\x80\x04\x39\xe4\x5e\xb4\x40\x2e\x3d\xa4\x41\x41\x89\x6b\x89\x31\xc5\x65\xc9\x65\x1c\x37\xc8\x7f\x2f\x68\xbb\x69\xf3\xd1\xc6\x17\x93\xd8\xd9\xd9\xd9\xa1\xe6\xf0\xa0\x69\xad\x6f\x5a\x9d\x86\xaa\x4a\x24\x50\x94\x19\xc1\x06\x5a\x6a\xeb\xaa\xea\x10\x9f\xb5\x15\x2c\x39\xa2\x65\x16\x08\xa3\x25\x2c\xad\xb7\x69\x20\x83\x19\xd5\x7d\x0d\x4f\xb2\xe6\xb8\xb2\xbe\xdf\xd7\x73\x98\xd7\xd5\x7a\xb0\x8e\x70\x8d\x03\xa8\x25\x9a\x3b\x1d\x1b\x67\xdb\xa6\x73\x9c\x4d\x63\x7d\x12\xed\x3b\x6a\x0a\xa9\x7a\xa2\xbb\x39\x87\x61\x50\x37\x30\x8e\xcb\xdc\xc2\x58\x46\x6f\x9b\x94\xf5\x56\xea\xba\x3e\x3e\x47\x72\x44\x01\x8b\x82\xf6\x54\x44\x5e\xc6\x3e\x8f\xe4\x25\x55\x2b\xda\x74\x8e\xf5\xea\xeb\x1d\xc5\x64\xd9\x5f\x4c\x17\x05\x70\x45\x12\x37\x70\xcc\x01\xb3\x1c\x8a\xcc\x53\x88\x1d\x29\xcd\x2b\x7f\x71\x52\x65\x2f\xd6\xe1\x1a\x93\xa9\x9f\x40\xf5\x84\x53\xdc\x54\x86\x2b\x6c\x7f\x87\xf8\xc8\x42\x67\xe8\x78\x1c\xb5\x37\x09\x2d\x39\x5e\x43\x47\x02\xdd\x07\xea\x84\xcc\x7e\x71\xb2\x32\x50\x84\x35\x34\x06\x16\xf2\x02\x8e\xe8\xc9\x53\xd4\xce\x6d\x90\xf4\x92\xf6\xc8\x98\x3d\x46\x8e\x04\x19\xb4\x07\xfb\x8e\xea\xfd\xb4\xed\xfa\x93\x4b\x11\x1a\x83\x60\xfa\xe0\x1f\x27\xfb\x4a\xca\x86\xa1\x83\xa8\xbe\x3c\xd4\x06\x39\x18\x2d\x84\xa3\x23\x7c\x79\x0b\xb1\x35\xd9\x39\x64\xff\xdd\x06\x70\x20\x7f\x6b\x56\x6a\xf1\xbf\xba\x8d\x84\xc0\x49\xfa\x48\xe9\x9b\xfb\xed\xa8\x3a\xf6\x12\x6d\x5b\xc8\x5f\xb2\x8e\x2b\x63\x23\x54\x40\xc3\x41\x9a\x9f\x36\xbf\x82\x75\x39\x3a\xa8\x4f\x50\x1f\xa0\x14\x67\x09\x59\x54\x69\x7c\xde\x35\x88\x84\x74\xd6\x34\xbd\x95\x21\xb7\x75\xc7\xe3\x53\xed\xd7\x21\x92\x23\x9d\x28\x35\x86\xd7\xde\xb1\x36\xcd\xf4\xe1\xe5\xf3\x3e\x3e\xc1\xd5\x1b\xc5\xba\x2c\xfe\x52\xe1\xce\x8e\x67\x7a\xde\x27\x51\xe6\x9d\xbd\xdf\xb6\xe7\xaf\xc4\x8d\xd1\xa2\x1b\x3b\x06\x8e\xf2\xda\xc7\x81\xd7\x1e\xea\x0a\xb9\xcd\x5e\xf2\xd9\xee\xef\xcf\x22\xe8\xde\x0a\x4e\xca\xc5\x5f\x4c\x67\x33\xff\xcf\x62\x3e\x47\xb9\xee\xb2\xf2\x5f\xb5\x8b\xca\x2e\x5b\x97\xce\x21\x6e\x13\xa1\x77\x9f\x59\xc2\xa0\xef\x08\x25\xf3\x64\xfe\xdd\x92\x59\xdf\x1f\x97\x01\x5b\xe2\x45\xf5\x23\x00\x00\xff\xff\x23\x00\x32\x8b\x29\x04\x00\x00") +var _provisionersKeycloakSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x55\x4d\x6f\x1b\x37\x10\xbd\xef\xaf\x78\x59\x0b\xb1\x84\x96\xbb\x51\x12\xb8\x81\x03\x1d\x7c\x2f\x5a\x20\x97\x1e\xd2\x40\xa0\x96\xa3\x5d\x46\x5c\x92\x25\x87\xfa\xb0\xe1\xff\x5e\x70\xa5\xca\x92\xad\xd6\x05\x5a\x9d\xb8\x98\x79\x6f\x1e\x1f\x67\x46\x57\x6f\xea\x85\xb6\xf5\x42\xc6\xae\x28\x22\x31\x04\x25\x07\xaf\x3d\x2d\xa5\x36\x45\x71\x85\xdf\xa4\x66\x2c\x5d\xc0\xc2\x39\x06\x3b\x2c\x08\x4b\x6d\x75\xec\x48\x61\x4c\x55\x5b\xc1\x12\x6f\x5c\x58\x69\xdb\x1e\xe2\xc9\x4f\xaa\x62\xd3\x69\x43\xf8\x8a\x37\x10\x4b\xd4\x6b\x19\x6a\xa3\x17\x75\x63\x5c\x52\xb5\xb6\x91\xa5\x6d\xa8\xce\xa4\xe2\x48\xf7\xed\x33\x94\x03\x35\x9d\xc3\x75\xae\x9b\x19\x73\xe9\x01\x24\xb4\xd5\x5c\x55\xd5\xf5\x67\x44\x43\xe4\x31\xcd\xd9\x96\xb2\xc8\xbb\xd0\xa6\x9e\x2c\xc7\x22\xee\x22\x53\x3f\x97\xa1\xe9\x66\xa3\x71\xb2\xb2\x27\x88\x7e\x52\xe8\x25\xbe\xa2\x1c\x9d\x84\x4b\xcc\x66\x28\xb7\x9f\x6e\xe6\x37\x1f\xcb\x5c\x9a\x3b\xb2\x05\x30\x40\x4b\xd9\xab\x9b\x8f\x65\xb1\xd4\xc5\x8a\x76\x8d\x71\x72\x35\x5f\x53\x88\xda\xd9\xd9\x68\x5a\xf8\xe0\x7a\xe2\x8e\x52\x9c\x5b\xa7\x68\x4e\x5b\xef\x02\x53\x38\xe6\x94\xd3\xea\x53\xf5\xbe\xcc\xda\xbe\x10\x87\x1d\x8c\x73\x1e\xe3\xe4\xb3\x43\x1f\xc0\xba\xa7\x38\x29\xec\xec\x5d\x91\x2c\x6b\x33\x68\xb3\x25\x44\x4b\xf8\x80\x6f\x85\x72\x05\x86\xdf\x15\x7e\x71\x4c\xb7\x68\x5c\xdf\x4b\xab\x22\x16\x64\xdc\x06\x32\x10\x68\xeb\xa9\x61\x52\x07\xcf\x49\x73\x47\x01\x5a\x51\xef\x1d\x93\x65\xb8\x80\x96\x2c\x05\x69\xcc\x0e\x51\x2e\xe9\x90\x19\x92\x45\xef\x02\x81\x3b\x69\xe1\x6c\x43\xd5\xa1\xda\xe0\x7c\x79\xc7\x4c\xbd\x67\x8c\x1e\xec\x63\x79\x88\xc4\xa4\x1c\x94\x5d\x42\xec\x90\xbc\x92\x4c\x78\xfb\x16\xbf\x5f\x88\x0e\x4f\x6b\x0c\x92\xbd\xd7\x1e\xdf\xe5\x5a\x8a\xe9\x4f\xc2\x79\xb2\xdf\xd5\x0a\xde\x45\x6e\x03\xc5\x3f\xcc\xc9\x51\x44\x0a\x6b\x0a\xd8\xb4\xc4\x2f\x68\xeb\x14\xc3\xd0\xa3\x67\xf9\x9c\x3c\xc4\xd0\x11\x6a\xf1\x02\xb2\x7f\xe4\x86\x0d\xc8\xca\x85\x21\x08\x61\xdd\xe6\xb4\xf6\x73\x44\xbf\x52\x3a\x40\x78\xd4\xce\x73\xfd\xd7\x8b\xbf\x48\x6b\x52\x30\x10\xbf\x42\xfc\x0c\x21\x5c\x62\x9f\x58\x64\xe0\x39\xaa\x63\xf6\xf1\xb6\xae\x5b\xcd\x5d\x5a\x54\x8d\xeb\x8f\xb1\xa7\x43\x20\x43\x32\x52\xac\x95\xdb\x58\xe3\xa4\xaa\x47\x0f\xcf\x3b\xed\xf1\x98\x2e\x2e\x04\xab\xec\xef\x73\x85\x7b\xd7\xcf\xf4\xbc\x4e\x22\xd4\x2b\xf7\xbe\x6c\xcf\x3f\x12\xd7\x4a\xb2\xac\x75\x9f\xe7\xe2\xa5\x8f\x9d\xdb\x58\x88\x2f\x18\x8d\x37\x9d\x93\xbd\x9e\xdc\x1e\x4f\x7f\x2f\x65\x68\x8f\x0b\xe6\x3e\x0d\x63\x7d\x36\x8c\x17\x3c\x5e\x8f\x1e\x5e\x1b\xdd\xc7\x73\x12\xf1\x2f\x10\x95\xd1\x36\x6d\xc5\xe8\x21\xaf\x8e\xc7\x8a\x65\xa8\xda\xfb\x53\xe5\x2c\x03\xb6\xeb\xe5\x3d\xfe\x7f\xea\xbd\x9f\xfe\xbf\x32\x9f\x5f\x7a\x3f\x74\xc6\x35\xd2\xe4\xd1\x3b\xad\x47\x5b\xcd\x78\x97\x3f\xec\x6c\x34\x1e\xdb\x1f\xa6\x93\x49\xfe\xda\xaf\xe4\xf7\xc5\x7e\x23\xef\x57\xf8\x9d\x31\x08\xc3\xf6\x93\xfb\x95\x12\xd1\xc9\x35\x21\xff\xb5\x90\xfa\x71\xe0\xd2\xb6\xbd\xce\xfc\x03\xef\xb4\xf8\x33\x00\x00\xff\xff\x5e\x4d\x4e\x93\x90\x06\x00\x00") func provisionersKeycloakShBytes() ([]byte, error) { return bindataRead( @@ -384,11 +384,11 @@ func provisionersKeycloakSh() (*asset, error) { } info := bindataFileInfo{name: "provisioners/keycloak.sh", size: 0, mode: os.FileMode(0644), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfa, 0x10, 0xae, 0x4f, 0x57, 0x7f, 0x3d, 0x2, 0x11, 0x9, 0x78, 0x50, 0x15, 0x65, 0x3d, 0xbb, 0xf8, 0x4b, 0x2d, 0xb9, 0xe3, 0xbd, 0x1d, 0x84, 0x30, 0x2f, 0x23, 0xf8, 0x76, 0xcd, 0xa4, 0x1f}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1c, 0x7f, 0x2f, 0x93, 0xf8, 0xa1, 0x37, 0x90, 0xb0, 0xea, 0xe3, 0x11, 0x2b, 0xf3, 0xa0, 0xd3, 0x90, 0xdc, 0x39, 0xae, 0x21, 0x94, 0xea, 0x2c, 0x11, 0x5c, 0x48, 0x2b, 0x6e, 0x5d, 0x2f, 0xa7}} return a, nil } -var _provisionersMetricsSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x56\x51\x6f\xdb\x36\x10\x7e\xd7\xaf\xb8\x26\x41\x93\x60\x23\x65\x25\x5b\x56\xa4\xc8\x43\xb1\xa7\x01\xc5\x1e\xfa\xb2\x87\xae\x10\x28\xf1\x2c\x71\xa6\x78\x04\x79\x8a\xed\x0e\xfb\xef\x83\x68\xc5\x6e\x63\x3b\x56\x50\x3d\x89\xe2\x77\xdf\x7d\x77\xd4\x1d\xef\xfc\x4d\x5e\x19\x97\x57\x2a\xb6\x59\x16\x91\x41\x60\x4f\xe0\x8d\xc7\xb9\x32\x36\xcb\xce\xe1\x2f\x65\x18\xe6\x14\xa0\x22\x62\x60\x82\x0a\x61\x6e\x9c\x89\x2d\x6a\xb8\x42\xd9\x48\x70\xc8\x4b\x0a\x0b\xe3\x9a\x71\xbf\xf7\xd7\x32\x5b\xb6\xc6\x22\x7c\x86\x37\x20\xe6\x90\x3f\xaa\x90\x5b\x53\xe5\xb5\xa5\x5e\xe7\xc6\x45\x56\xae\xc6\x7c\x20\x15\x5b\xba\x2f\xef\x41\x13\x60\xdd\x12\x5c\x0e\x7e\x07\xc6\xc1\x75\x32\x12\xc6\x19\x96\x52\x5e\xbe\x87\x68\x11\x3d\x14\x03\xda\xe1\x20\xf2\x13\x72\x58\x83\x25\xf2\x70\xd5\xfb\x41\xc5\x2d\xb0\xe9\x30\x5e\x67\xee\x61\x96\xf5\x8e\x8d\x85\xcf\x70\x76\xe1\xce\x40\x34\x08\xb7\xf0\x25\xd3\x94\x41\x7a\xce\xe1\x4f\x62\xbc\x87\x9a\xba\x4e\x39\x1d\xa1\x42\x4b\x4b\x50\x01\x01\x57\x1e\x6b\x46\x3d\xc6\x85\x86\x5b\x0c\x60\x34\x76\x9e\x18\x1d\x03\x05\x68\xd0\x61\x50\xd6\xae\x21\xaa\x39\x8e\xc8\xd0\x3b\xe8\x28\x20\x70\xab\x1c\x90\xab\x51\x8e\xde\x52\x74\x67\x1f\x98\xb1\xf3\x0c\x17\xff\xba\xff\xce\xc6\x9d\xd8\x6b\x02\xe5\x59\x34\xc3\x39\xac\xa1\xf7\x5a\x31\xc2\xdb\xb7\xf0\xf7\x21\x44\xca\xa1\xb5\x03\xd2\x07\xea\x90\x5b\xec\xe3\x1e\x3a\xae\x23\x63\x57\xb3\x05\x74\xaa\xb2\xf8\x12\xf6\x00\xb3\xd2\xba\x8f\x18\xc0\x9a\x6a\x4e\x8e\x6b\x72\x73\xd3\x14\xd0\xf5\xd1\x7e\x6b\xbe\x1c\xcc\x5a\x66\x1f\xef\xf3\x5c\x5b\xd9\x04\x35\x57\x4e\xc9\x9a\xba\x9c\x62\xcc\x03\x5a\x54\x11\xf3\xf1\x7b\x59\xcc\xe4\x8d\xbc\x2d\x55\xa7\xef\x7e\x91\x1a\xab\x3d\x29\xda\x2f\x1a\x10\x06\xa6\x18\x7c\xe7\xbc\x31\xdc\xf6\x55\x72\x6c\x5c\xd5\xd7\x0b\xe4\xdd\xcb\x28\x23\xe6\x9a\x96\xce\x92\xd2\xf9\xe3\x8d\x2c\xe4\x6c\x8b\x28\xd3\xb2\xb4\xc6\xf5\xab\x09\xea\xa6\x9b\x1d\xd3\xf8\x4f\x1f\x79\xa9\xb8\x6e\x87\x05\x5a\x15\xd9\xd4\x11\x55\xa8\xdb\x12\x57\x9e\x02\x63\x38\xa4\xba\x48\xaa\x0f\xe3\x45\xda\x94\x49\x8c\xd8\x88\x61\x15\x64\xf3\x75\x2f\x8c\x6e\xa1\x4d\x80\x9c\x3c\x1f\xa1\xda\xb3\x60\x15\x40\x7c\x5d\xcd\xe1\xb5\xae\xc5\xef\x2f\xfa\x11\x22\x72\x30\x5e\xd4\xd4\x79\x72\xe8\x38\x3e\x14\x53\xd2\x47\xd6\x3c\x62\x98\xcd\xee\xf2\x80\xda\xc4\x13\x39\xfb\xf5\x9d\x9c\x3d\x03\x8a\xf1\xf3\x2b\xd3\xf5\x3d\xc9\xf1\x34\x4d\x77\xf6\x94\xa0\x67\xcc\xa7\x12\xf3\xac\xc6\xb5\xc2\x8e\x9c\x08\x38\x84\x7c\xba\x17\x8c\xd5\x25\x22\x86\xc7\x03\x61\x0c\x9f\x4d\xbd\x07\x8b\xac\x02\x9f\x26\x7f\x2a\x8e\xa3\xb4\x5b\xc0\x1e\xe1\xb1\xe3\x1e\x85\xe4\xca\x5a\x5a\x1f\x3e\xe3\x5b\x59\x6c\xb6\x45\x7a\x17\x85\x3c\x5d\xc6\x53\xf1\x7b\x21\x26\xc3\xd7\x08\xf7\xeb\x40\xb1\x26\x8f\x87\xc5\xff\x26\x8b\x1d\xa4\x4c\xeb\xc9\xbd\xe8\xb5\x76\x9b\xbf\x59\xf8\xdd\xd5\xbc\x65\xd8\xc3\xd6\x2d\x2d\xdd\xce\xc3\xfd\x0e\x29\x3e\x4d\xb1\xdf\xbf\x84\x8e\x42\xbf\x29\xb2\xb5\xaa\x71\x4a\x72\x1d\x06\x1d\x97\x14\x74\xcc\xd7\xc8\x42\x39\x1a\x6e\x69\x91\x86\x86\xd4\x5b\xc5\x4b\x6d\x61\x26\xef\x0a\x79\x73\xca\xb2\xdc\xc0\xca\x8f\x29\xab\xab\x77\x77\xe5\xf1\x3e\xb1\xad\xfe\x1f\xe0\x7c\x6a\x07\xcf\x73\x70\x0e\x7f\x8c\x97\xf3\x47\x5a\x98\x89\x7f\x9d\xa5\x85\x39\x14\xfa\xad\xbc\x91\xb3\xb4\x5b\xa6\xd7\x09\x7f\xd9\x24\xf0\xee\xb8\x37\x95\x6d\x77\x52\x71\x65\x18\x66\xc3\xc2\x3d\x5c\x5c\x5d\xb9\x9f\x8a\xeb\xeb\x61\xb5\x99\xe8\x6e\xb2\xcd\x40\xb7\x99\x00\x3f\x58\x0b\x21\x0d\x76\x6a\x33\x2d\x45\x68\xd5\x23\xc2\x30\x99\xa2\xfe\x39\x71\x19\xd7\x5c\x0e\xfe\x13\x6f\x91\xfd\x1f\x00\x00\xff\xff\x2b\x00\xf2\xa9\xcf\x0a\x00\x00") +var _provisionersMetricsSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x59\x6d\x6f\xe3\xb8\x11\xfe\xce\x5f\x31\xa7\x0d\x6e\x13\xb4\x94\xe2\xec\x35\x5d\xec\x42\x05\xb6\xed\xe2\x70\xc0\xe1\x5a\xec\xf5\x70\x28\x72\x81\x41\x4b\x23\x89\x35\x45\x0a\x24\xe5\x97\x0d\xfc\xdf\x0b\xd2\x92\x25\x2b\x92\x9d\x6c\x92\x2f\xb1\x38\x33\x0f\x47\xf3\x0c\x87\x43\xea\xcd\x77\xd1\x82\xcb\x68\xc1\x4c\x41\x88\x41\x0b\x14\x6b\x05\x15\xaf\x30\x63\x5c\x10\xf2\x06\x7e\x67\xdc\x42\xa6\x34\x2c\x94\xb2\x60\x15\x2c\x10\x32\x2e\xb9\x29\x30\x85\x4b\x0c\xf3\x10\x24\xda\xb5\xd2\x4b\x2e\xf3\x46\x5e\x57\x57\x21\x59\x17\x5c\x20\xdc\xc1\x77\x40\x33\x88\x56\x4c\x47\x82\x2f\xa2\x44\xa8\x3a\x8d\xb8\x34\x96\xc9\x04\x23\x07\x4a\x0f\x70\xf7\x1f\x21\x55\x80\x49\xa1\xe0\xad\x9b\xd7\x21\xba\xa9\xbd\x11\xe5\x92\xdb\x30\x0c\xdf\x7e\x04\x23\x10\x2b\x98\x39\x6d\x89\x84\x10\xb3\x35\x16\xcb\x39\xd3\x49\x11\x5f\x5c\xd6\x92\x95\x08\xb4\xbc\x22\x3c\x83\x3b\x08\x2e\x7a\xe2\x00\xe2\x18\x82\xcd\xfb\xdb\xf9\xed\x0f\x81\x9b\xcf\x16\x28\x09\x80\x37\x0d\x58\x99\xde\xfe\x10\x90\x8c\x13\xb2\xce\xd1\xce\x13\x55\x96\x4a\xce\x99\xce\x4d\x1c\x50\x2a\x15\x4d\x84\x5a\x2c\x50\x07\x84\xe4\x9a\x65\x4c\xb2\xf9\x0a\xb5\xe1\x4a\xc6\xc1\xec\x3a\xbc\x09\xdf\x05\x07\x41\xc5\x92\x25\xcb\x31\x0e\x9a\x81\x80\x54\x5a\x95\x68\x0b\xac\x4d\xcf\x2a\x7c\x1f\xde\x1c\x89\xa4\x4a\x71\x8e\x9b\x4a\x69\x8b\xfa\x91\x22\x97\x8b\x3a\x59\xa2\xed\x04\x37\xe1\x2c\xbc\x0e\x08\x0a\x66\x2c\x4f\x0c\xba\x57\x19\xb5\xf7\x6a\x1a\x53\x6e\x46\xc5\x7f\x79\xef\xe4\x4c\x08\xb5\xed\x0f\xbf\x0b\x67\xed\xa8\xc6\x55\x1c\xcc\x02\x52\x6d\xb5\x32\x89\xaa\xb0\xaf\xf7\xd7\xf0\x48\xd2\xea\x6e\x59\xd2\x53\xbb\x0e\x6f\x67\xee\x2d\x84\x5a\xf2\x6e\xf4\x5d\x78\xe3\xa6\x26\x59\x2d\x13\xcb\x95\x04\x9f\x1e\x42\xcc\x53\xac\xcc\xe5\x15\x3c\x10\x00\x00\x53\xa7\x0a\x52\x99\x01\xdd\x42\x5d\xa5\xcc\x22\x7c\xff\x3d\xfc\xf1\x48\xd6\x18\x83\x63\x10\x32\x25\x6d\xa2\x64\xc6\x73\xb2\x1b\x99\xa0\xa1\xa6\x99\xc1\x27\x5e\xf0\xd3\x5e\xe6\x72\xef\xc7\x96\x39\x27\xf5\x78\x17\x0f\xc3\xc4\xd8\x01\xfd\x17\x34\x38\x34\xaf\xf2\x70\x89\x5b\x28\xac\xad\xcc\x87\x28\xd2\x55\x19\x36\xb2\x30\x51\x65\xd4\xc8\x3b\x9f\x75\x55\x02\xa5\xbc\x74\x74\x0c\x51\x3a\x2d\x53\x00\x4d\xe0\xed\xde\xbf\xbb\x46\xed\x9e\xb8\x3c\x8f\x9b\x27\xb2\x60\x06\x6b\x2d\xe2\x89\xa9\x89\xc6\x4a\xcd\xf3\x2a\x4f\x0a\x4c\x96\xf1\x8c\xa0\x64\x0b\x81\x69\x3c\x23\xbd\xc1\xbc\xca\x97\xb8\x9d\xc2\x38\xb8\x6f\x8c\x58\xa1\xe6\xd9\x36\x9e\xb9\xdf\x09\x4b\x50\xdb\x38\x42\x9b\x44\xd5\x92\x47\x56\x98\xc8\x8d\x98\x28\x61\x74\x51\xcb\x54\x60\x98\x68\x1b\xc0\xdf\xc0\xeb\x6c\xeb\x32\x74\xee\x98\x30\x8d\x5a\x78\xf7\xfc\xf6\x34\xa1\x6d\x78\x2e\x1e\x06\x6b\x6f\x37\xb0\xdb\xaf\xf7\xc4\x0a\xd8\xbf\x24\xb8\xa5\xbb\x3e\xd8\x1b\xd4\x2b\xd4\xa3\xf9\x30\xb5\x0c\x0f\x49\xf8\x28\x45\xfe\x7d\xb0\x80\x5f\x54\x8a\xf0\xb9\xb1\xe8\xe5\x4c\x1b\xcd\x9c\xdb\xa2\x5e\xf8\x40\x76\xf3\x44\x47\xf3\x44\x1a\x05\x32\x83\x26\x4a\xd5\x5a\x0a\xc5\xd2\x68\x75\xf1\x70\xae\x38\xec\x8e\x41\xe8\x13\x2c\x42\xc1\x65\xbd\xa1\x17\x0f\xae\x5a\xec\x42\xcb\x74\x98\x7f\xed\xc2\x68\x99\x86\xcd\x2a\xfb\x0a\xaf\x0d\xec\xf9\x49\xaa\x97\xe2\x1e\xbf\x30\x44\xb5\xd1\x91\x50\x09\x13\x6e\x37\x3b\xc3\xec\x53\xb8\xdc\xb3\xc7\x33\xf8\x0e\x78\x0a\x41\x67\x1c\x1c\x76\x8c\xfd\x9f\x7f\x1f\x96\xa6\xb5\x41\x0d\xfb\x1d\x42\x23\xb3\x48\x0b\xe5\xf6\x20\x6a\x0a\x14\x02\xfc\x1e\x9b\x31\x61\x10\x3a\xa8\x8f\x1e\x24\xe3\x1f\xbb\xc0\x94\xcb\x94\x6b\xa0\xd5\x7e\x99\x74\xaa\xdd\xf6\xd9\x1b\x1b\xc4\xb4\x50\x6b\xd9\x43\xff\xd0\xb7\x1e\xa0\x3d\xc3\xf2\xd4\xbc\x93\x05\xf1\x74\xc2\xf7\x7e\x9e\xcb\xf6\x43\x7e\x77\x63\x74\x54\xe1\x09\xe9\x4c\x37\x5f\x33\x78\x21\x4e\x9b\xbd\xcf\x83\x39\x22\xf2\x28\x53\xa3\xe7\x50\x71\x6c\x39\x4d\xe7\x37\xb9\x67\x95\x12\xaf\xeb\x9c\x47\x7c\xe4\x1a\xd5\xcf\xf5\x2e\x51\xd2\x28\x81\x67\xb3\xf8\x05\xd8\x73\xc1\x17\x9a\x69\x7e\x7e\x12\x1f\x02\xfa\xe5\x69\xeb\xac\x73\xfd\x35\x50\x7a\x4e\x0e\x76\xbb\xa3\xe6\xe0\x37\xc9\xed\x3d\xf9\x27\x9a\x44\xf3\xca\x55\xc0\xb8\xab\x6a\xe4\x77\x26\xad\x89\x9b\x76\x9d\x2a\x29\xb8\x44\x97\xe4\x39\x5a\xf2\x29\xb3\xa8\x27\x64\x77\xbf\xa2\x5e\xf1\x04\xef\xc9\x6f\x06\x75\xdc\x39\x47\x7e\xd4\xaa\xae\xfa\x03\xff\xd9\x56\x18\x1b\x5e\x56\x02\xc9\xe7\x0d\x26\xbf\x5a\xe6\x5a\x83\xc9\xe4\xfd\x83\x50\xba\x6f\xd0\xc2\xcc\x9d\x17\x86\x6f\xdf\xfd\x0c\xb7\xa5\xf0\xea\xc6\x2a\xcd\x72\x0c\x3d\x5e\x58\x31\x5b\x8c\xd5\xa9\xc8\xeb\xae\xd1\xd5\x1f\x1f\xc0\xd0\x62\x59\x09\x66\xd1\xc4\x93\x44\x0d\x4d\x0e\x31\x9f\x32\xe9\x58\x21\x77\xcd\x4e\x72\xef\xc3\x8c\xe9\xdf\xb7\x71\x59\x0b\xcb\xa9\xdb\x1b\x9a\x48\x1e\x5a\xa0\x7d\x8b\x92\x36\xff\xfb\x6f\x69\xf6\xa1\x1e\xf6\x42\x5d\x4f\x93\x32\x2c\x95\xa4\x1a\x5d\xc1\x1c\xdd\xeb\xda\x33\xc2\xf4\x4e\xf7\x53\xa3\x71\xa6\xb3\x1d\x29\xe4\x2d\x76\xf7\x63\xb4\x88\x0f\x8f\x29\xbb\x83\xfe\x7c\x44\x38\xf7\xcb\x72\xde\x96\x5d\xd7\x14\x3f\xee\x04\x3d\xdd\x6d\x2f\xe8\xdb\xc2\x17\x00\x76\xe1\x34\x2e\x41\x9b\x0e\xb1\xc5\x19\x8d\xea\xf8\x01\x6b\x3a\xc6\x9f\xfb\xfa\x63\x7d\xe1\x13\x23\xfe\xbf\xda\xd8\x35\xb3\x49\xe1\x1e\xc6\x9d\x18\xe7\xe0\xf4\x89\x70\x37\x81\x45\xcf\x1a\x3e\x65\x93\xec\x3a\x19\x55\xd9\x89\x99\x06\x26\x7e\x93\xfe\xba\xc9\xe0\x75\xfd\xa2\xff\x38\xe9\x83\x2b\x27\x9a\x57\x34\x51\x65\xa5\x24\xba\xfa\x38\x1b\xa5\xff\xf8\xe0\x3c\x4d\xfb\x17\xa7\xf7\x02\xba\x95\xe0\x2b\xd4\xd7\xd7\xb7\xd1\xf1\x8c\xe3\x1c\x8f\x1f\xe7\x77\x03\x5b\x3a\xad\xf9\x7c\x32\x8f\x81\xa6\x48\x7c\xa1\x03\x2d\x6b\x83\xc9\x9e\xcc\x96\xbf\xb0\x98\x26\xe9\x93\x13\x3f\x9f\x9b\xe6\x04\x19\x79\xf4\x71\x42\x8e\xee\x4f\x76\x7b\x4d\x3a\x1c\x3e\x0c\x68\x5c\xed\xc2\xe7\x95\xbd\x97\x21\x4e\x1c\x8d\xbd\xed\xf8\xb9\xa9\xbd\xd1\x39\x71\x6c\x6a\x55\x4e\x9f\x79\xdb\xe0\x1d\x10\x27\xda\xff\xe1\xe5\xd2\xae\xb3\x98\x8f\x89\xbf\x69\xf3\x78\x21\x64\xb7\x22\x0e\x8d\x47\x0b\x32\xde\x35\xb7\xd2\x0f\x9d\x1e\xfd\x72\xde\x7a\x82\xae\x83\xfa\x28\x65\x5b\x96\x9c\x60\xeb\xbf\x2c\x69\x88\x1a\x59\xdb\xce\x74\x70\xc0\x1b\x61\x52\xa2\x4e\xcd\x5a\xe9\xd4\x44\x5b\xb4\x94\x49\x65\x0b\xd4\xd4\xdf\xd2\xfa\x9d\x8a\x9e\x2e\x5a\xfd\x3b\xc1\xdd\x39\x88\xf9\x40\x7f\xfe\x73\xc3\x4d\xef\x56\x77\xa2\x6e\x1d\x8a\xd1\x6b\x4e\xd1\x56\x26\x67\x31\x1a\x7e\xa1\x96\x7c\x3a\xfc\x3f\xab\x25\x7f\xda\x3a\x71\x38\xe3\xf1\xeb\xdf\x9e\xee\xbc\x1e\x1d\x0c\x86\x03\xdf\x1f\x67\xb0\xbf\x78\xe4\xf0\x6d\xc6\xc3\xee\xc9\x99\xbb\x58\xbc\x81\x2f\x68\xf5\x16\x84\x52\x15\x5c\xd6\x15\x58\x05\xef\xc0\xf2\x12\xcd\x15\x91\xf1\x35\xa9\xa5\xe5\xc2\xdf\xc9\xcb\x00\x68\x8e\x30\x83\x7b\x92\xaa\xe6\x3a\xe5\x0d\xfc\xa2\x2c\x7e\x00\x57\x86\x99\x4c\x0d\x2c\x50\xb8\xe2\xa4\x11\x70\x53\x61\x62\x31\x6d\x3e\x30\x20\x77\x5c\x02\x4f\xb1\xac\x94\x45\x69\x41\x69\xc8\x51\xa2\x66\x42\x6c\xc1\xb0\x0c\x1b\x4d\x5d\x4b\x28\x95\x46\xb0\x05\x93\xa0\x64\x82\x61\x33\xdb\x9e\x9a\x4f\xd6\x1d\x0b\xdc\x0e\x20\x77\x41\x23\xe9\x5f\x3f\x77\x6f\x0e\x8f\x6e\x8d\x47\x44\x63\x47\xc7\x31\xe9\xf1\x2d\xd7\x98\x6e\xdb\x8b\x8e\xc9\xce\xf5\x53\x30\xd1\xb5\x8c\x69\xf8\xd2\x3f\xea\xec\xe3\x9a\x04\x47\x35\x66\x6c\xdc\x65\x42\x7f\x1c\x37\xdc\xc2\xb5\x7b\x90\xf1\xc5\xe5\xa5\xfc\xd3\xec\xea\xca\x3d\xed\xbf\xe0\xdc\x90\xfd\x07\x9c\xfd\x17\x9f\x4f\x42\x80\xf6\xf9\xc3\xf6\xa4\x18\x28\xd8\x0a\x21\x63\x5c\x60\xfa\x67\x8f\xc5\x65\xee\x4f\x46\x1e\x77\x46\xfe\x1f\x00\x00\xff\xff\x36\xe2\x7e\x59\xbf\x1a\x00\x00") func provisionersMetricsShBytes() ([]byte, error) { return bindataRead( @@ -404,11 +404,11 @@ func provisionersMetricsSh() (*asset, error) { } info := bindataFileInfo{name: "provisioners/metrics.sh", size: 0, mode: os.FileMode(0644), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb4, 0xcb, 0xc2, 0x91, 0x3, 0xfd, 0xae, 0x8f, 0x8f, 0x8, 0xdb, 0xbb, 0xc1, 0x6d, 0xd6, 0x96, 0xd, 0x5, 0x8e, 0xce, 0x81, 0x64, 0xe9, 0x8f, 0x3a, 0x6d, 0xd3, 0x73, 0x49, 0x6f, 0xd1, 0xae}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe2, 0x5a, 0x6b, 0x68, 0x87, 0x26, 0xe8, 0x38, 0xb4, 0xea, 0x40, 0xc0, 0xeb, 0x2, 0x65, 0xec, 0x3c, 0x91, 0x9b, 0x6, 0x64, 0x9f, 0xc3, 0x18, 0x92, 0xee, 0x67, 0xe9, 0x12, 0x55, 0x2e, 0x37}} return a, nil } -var _provisionersProxySh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x56\x51\x6f\xdb\x36\x10\x7e\xd7\xaf\xb8\x26\x41\x9d\x6c\xa5\xe8\xa4\xc5\x1e\x5a\x64\x40\x9f\x86\xbd\xac\xc0\xb0\x61\x0f\x59\x60\x50\xe2\x59\x22\x4c\xf1\x38\xde\xd1\x8e\xb1\xee\xbf\x0f\x94\xd4\xd4\x75\x9a\x2e\x2b\xea\x17\xe9\xcc\xef\xfb\xee\x23\x79\x3c\xea\xf4\x99\x6e\x5c\xd0\x8d\xe1\xbe\xaa\x18\x05\x14\x66\x82\xe8\x22\xae\x8d\xf3\x55\x75\x0a\x7f\x18\x27\xb0\xa6\x04\x0d\x91\x80\x10\x34\x08\x6b\x17\x1c\xf7\x68\xe1\x1c\xeb\xae\x86\x80\xb2\xa3\xb4\x71\xa1\x9b\xc7\x73\xbc\xa8\xab\x5d\xef\x3c\xc2\x0d\x3c\x03\xb5\x06\xbd\x35\x49\x7b\xd7\xe8\xd6\x53\xb6\xda\x05\x16\x13\x5a\xd4\x45\x54\xdd\xcb\xdd\xbe\x01\x4b\x80\x6d\x4f\xb0\x28\x79\x8b\x62\x49\x3d\x92\x94\x0b\x4e\xea\xba\x5e\xbc\x01\xf6\x88\x11\x2e\x0b\x3a\x60\x31\xf9\x2b\x4a\xda\x83\x27\x8a\x70\x9e\x63\x71\xf1\x12\xc4\x0d\xc8\x17\x55\xb8\x5e\x56\x39\x88\xf3\x70\x03\x27\x67\xe1\x04\x54\x87\xf0\x12\x6e\x2b\x4b\x15\x8c\xbf\x53\xf8\x85\x04\x5f\x43\x4b\xc3\x60\x82\x65\x68\xd0\xd3\x0e\x4c\x42\xc0\xbb\x88\xad\xa0\x9d\xe7\x85\x4e\x7a\x4c\xe0\x2c\x0e\x91\x04\x83\x00\x25\xe8\x30\x60\x32\xde\xef\x81\xcd\x1a\x67\x64\xca\x01\x06\x4a\x08\xd2\x9b\x00\x14\x5a\xac\xe7\x6c\xe3\xec\x4e\xde\x8a\xe0\x10\x05\xce\xfe\x0e\xff\x9c\x1c\x8e\x2c\xa4\x8d\xab\xa6\x49\x0b\x78\x0f\x9c\x2d\x81\x20\x82\x32\xa0\x51\x5a\x3d\x90\xcd\x1e\x19\x9e\x3f\x87\x3f\x67\xd2\x88\x19\xc8\xc6\x44\x0d\xc2\x4c\x3e\x04\xec\xba\xb2\xab\x7f\xbd\x03\x05\xbd\x48\xe4\xd7\x5a\x87\xce\x85\xbb\x9a\x52\xa7\x37\xb8\xe7\x29\x5c\xb1\xeb\x82\x0b\x5d\xbd\xc1\x3d\xbc\x87\x2e\x76\xa0\x94\x45\x93\x06\x4a\x87\x56\x46\x1f\x26\x8a\x96\x94\x59\xd0\xd6\x5d\xec\x6a\x3b\x4b\x16\xd6\xb1\x37\xee\x41\xb5\xb0\x98\xa6\x6d\xb1\x81\x1b\x93\xda\xfe\xda\x0c\xf6\x87\x57\xb7\xa3\xa5\x4f\x1c\x45\xd3\x6e\x4c\x87\xac\x07\xe3\x82\x77\x01\x75\x6e\x72\x90\xac\xe1\xec\xdc\x73\xb3\x4a\xe8\xd1\x30\x82\x6a\xf9\x02\x46\xda\x09\xfc\xf8\xd1\x15\x53\x4e\x2d\x72\xed\x1d\xcb\xbd\xad\x12\x2c\xfe\xd3\x98\xe2\xd4\x7e\x23\x3f\x5f\x67\xc8\x44\x51\xe3\x66\xed\x21\x47\x6b\x04\x1f\x45\x8c\xc7\xc7\xfb\x82\x1c\x05\x9f\x02\x8c\x89\x06\x94\x1e\x33\xab\x40\x16\x15\xde\x45\x4a\x82\xe9\x49\x49\xf2\x60\x5a\xf1\xe0\x5d\xc8\x77\x4a\x88\x3c\x2b\xb3\xe3\xe3\x58\x79\x61\x75\x75\x55\x2f\x5f\x3d\x5c\xec\x3d\x0b\x0e\x45\xc3\x1a\x1c\x28\xa8\x84\x9e\x8c\xfd\x02\x0e\x83\x69\x3c\x3e\x32\xbf\x61\x63\x5d\x02\x15\xa7\x75\x1e\x31\x9a\x83\x8b\x11\xe5\x33\xa7\xe3\x73\x60\x27\xc8\xca\x6c\x8d\xf3\x63\x9a\xa7\x73\x26\x5f\x0f\x9d\xa7\x61\xec\x73\x8f\xc0\xb5\xc5\xb5\xc9\x5e\x1e\xd0\x7c\x00\xb5\xe6\x2f\x58\xd3\x83\x11\xc1\x34\x10\xcb\xe3\xea\x07\x98\x83\x04\xa7\xf0\xf3\xbc\x87\xef\x22\x86\xdf\xd0\xe3\x30\xf6\xc9\x96\xbc\xc7\x56\x28\xbd\x80\xcc\xa5\xc7\x4e\x25\x0d\x99\x31\x95\xfe\x65\xb6\xe4\x2c\x44\x4c\x83\x63\x76\x14\xc0\x31\x67\xe4\xc3\x86\xf2\xa1\x95\x74\x4e\xfa\xdc\xd4\x2d\x0d\x9a\x22\x06\x25\x1f\x92\x8c\xe1\x7d\xa4\xee\x53\xaa\xf9\xc0\xb0\xbe\x7f\xb1\xb4\x0b\xa5\x18\xf4\x76\x59\x5f\x5e\x2e\xeb\xa5\x26\x41\xdf\x92\x57\x2d\x05\x49\xae\x59\xcd\xff\xaf\xc6\x7a\x5b\x8d\xad\xa3\x2e\xad\xe4\x78\x31\x6d\xdc\x74\xa0\x1c\x7c\x2d\x9f\xd1\x16\xfa\x82\xf5\xef\x8c\xe9\xba\xfe\x6e\x7a\xce\x27\xbe\x5b\xc0\x78\x85\x4d\x35\x6a\xe7\xe7\xb1\xd9\x9a\x31\x6d\x5d\xfb\xb0\xa4\x3e\x8a\xff\x94\x28\xc7\xa2\x3e\xbd\x7c\x1b\xf9\x4f\x2b\xf6\x88\xf5\x7f\xce\xe3\xd1\x78\x42\x16\x93\xe4\x78\x4d\x0f\x15\xf1\xce\x09\x2c\x4b\x10\xae\xcf\xce\xcf\xc3\xf7\x97\x17\x17\x25\x9a\xae\xe9\xab\x6a\xba\xa5\xa7\xeb\xed\xad\x2f\x92\xa5\x0a\xcd\x74\x05\x32\xf4\x66\x8b\x50\x3e\x37\xd0\xbe\x18\xb5\x5c\xe8\xc6\xee\x38\xea\x5e\x56\xff\x06\x00\x00\xff\xff\xfa\xfd\x71\xb4\xa4\x08\x00\x00") +var _provisionersProxySh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x56\xdf\x6f\xdb\x36\x10\x7e\xe7\x5f\x71\x55\x8c\xc6\xde\x26\x31\x6e\x8b\xa2\x68\xe1\x01\xc5\x30\x0c\x7b\xe9\x86\x61\xc3\x1e\xda\xc2\xa0\xc8\x93\x44\x98\xbf\x40\x9e\x1c\xbb\x59\xfe\xf7\x81\x92\x9a\x26\xb1\xdd\x74\x58\x9e\x24\x8a\xdf\x7d\x1f\xf9\xdd\xf1\xc4\xb3\x27\xbc\xd6\x8e\xd7\x22\x75\x8c\x25\x24\x28\xb1\xf7\x10\x74\xc0\x46\x68\xc3\xd8\x19\xfc\x2d\x34\x41\xe3\x23\xd4\xde\x13\x90\x87\x1a\xa1\xd1\x4e\xa7\x0e\x15\xcc\xb1\x6a\x2b\x70\x48\x97\x3e\x6e\xb4\x6b\xa7\xf9\x3e\x2c\x2a\x76\xd9\x69\x83\xf0\x1e\x9e\x40\xd9\x00\xdf\x8a\xc8\x8d\xae\xb9\x34\xbe\x57\x5c\xbb\x44\xc2\x49\xe4\x99\xb4\xbc\xa1\xfb\xf8\x06\x94\x07\x94\x9d\x87\xf3\xac\x9b\x19\xb3\xf4\x10\x54\x6a\xa7\xa9\xaa\xaa\xf3\x37\x90\x0c\x62\x80\x65\x46\x3b\x64\x2c\xed\x13\xa1\x5d\x8b\x28\xbb\xd5\x6c\xde\x3b\x61\x11\x4a\xbb\x60\xba\x81\xf7\x50\xcc\x6e\x4d\x17\xb0\x5a\x41\xb1\x7b\xf5\x72\xfd\xf2\x45\x91\xe5\xa8\x43\xc7\x00\x86\xd0\x42\x58\xf5\xf2\x45\xc1\x1a\xcd\x42\xf4\x16\xa9\xc3\x3e\xad\x9d\x57\xb8\xc6\x5d\xf0\x91\x30\xae\xb7\x18\x93\xf6\x6e\x55\x2c\xab\x57\xd5\xb3\x82\x39\xa4\x80\xb8\xf9\xf2\xfd\xa2\x5a\x56\x2f\x0a\xe6\x09\xcd\x5a\x7a\x63\x50\x92\x8f\x77\xa6\x97\x17\xd5\x45\xc1\x58\xd3\x3b\x49\xda\x3b\x18\xbc\x30\x66\x7d\x4a\x73\xbe\x80\x2b\x06\x00\xa3\x2f\xc5\xaf\x23\x3c\x5b\xf3\xfb\x4d\x04\xbc\xf3\x0a\xe1\xe7\x29\xa2\x18\xe0\x97\x2d\x12\x74\x44\x21\xbd\xe6\xbc\xd5\xd4\xf5\x75\x25\xbd\xe5\x5f\x74\xf8\x1d\x1d\x1e\xd1\xa0\x48\x98\xb8\xf2\x97\xce\x78\xa1\xf8\x76\x76\xf5\x90\x13\xd7\x77\x49\xca\x6f\x88\xa8\x8c\x76\xfd\xae\x9c\x5d\x65\xd7\xaf\x2b\x12\xb1\x6a\x3f\xc1\xd3\xa7\xf0\x61\x58\x37\x89\x08\xbb\x6d\xf3\x09\x1e\x9b\x38\xf5\xca\x83\x0c\xff\x97\xf7\xee\x86\x81\xf7\x29\x72\xe3\xa5\x30\xf9\x24\xb1\xeb\x23\x99\xbd\x5b\x0c\xa7\xf3\xf9\x5b\x40\xf7\x27\x1a\xb4\x48\x71\x0f\x3f\x7d\x0e\xf8\x7a\x3a\x7d\x40\x57\xd2\xe7\xa8\x61\x78\x33\x2a\x6f\x44\xcb\x9b\xe4\x1e\xcd\xf2\xf1\x72\xbd\xe6\xf9\xbb\xf4\xa6\x94\xde\x51\xd4\xf5\xfa\x24\x72\x3d\x58\xb4\xfe\x6c\x7d\x0c\xf6\x9e\xef\xf9\x4b\xa9\xe1\xf1\x08\x13\xaa\x4c\x58\x24\xfe\x57\xc2\xb8\xaa\xbe\x1b\x9f\xb3\xf9\x65\xe7\x85\xd5\x0b\xde\x16\x30\x74\x9c\xf1\xf8\xab\xe9\x79\x7f\x4b\x55\xc2\xb8\xd5\x12\x4f\xb2\xff\x12\x7d\x1f\x32\xfd\xf8\xf2\x58\xfc\x03\x58\x92\x01\x25\xd0\x7a\x97\xf3\xe3\x85\x3a\x89\x8a\x98\x48\x44\xba\xef\x5f\x2e\xb7\x33\xf8\x63\xa8\x17\xe3\x7d\x80\x79\x1f\x72\x0f\x7e\x0e\xa4\x2d\xa6\x05\x73\xab\x0b\xd6\x3b\xd2\x66\xe8\x84\xae\x80\xb2\x45\x78\x0e\x1f\x99\xf2\x83\x0c\xc0\x19\xbc\xf3\x84\xaf\x41\x7a\x6b\x85\x53\x09\x6a\x34\xfe\x12\x44\x44\xc0\x5d\x40\x49\xa8\xa6\xae\x8e\x9a\x3a\x8c\xa0\x15\xda\xe0\x09\x1d\x81\x8f\xd0\xa2\xc3\x28\x8c\xd9\x43\x12\x0d\x4e\xc8\xd8\x3b\xb0\x3e\x22\x50\x27\x1c\x78\x27\xb1\x9a\xd4\xc6\x9a\x7f\x4b\x84\x36\x10\xcc\xae\xdc\x75\x71\x7b\xe6\x9c\x64\x58\xd7\x75\x3c\x87\x7f\x46\x07\x08\x11\x38\x92\xe4\xd6\xab\xde\x60\x2a\xb3\x4b\x95\xe2\x13\xae\x92\xde\x35\x5f\x4c\x9b\x6c\xb3\x5e\x85\xe8\x6b\x84\x09\x75\x00\x18\x8a\xb1\xd4\x36\x1f\xe1\x9b\x33\xe5\x5a\xed\x76\x95\x8f\x2d\xdf\xe0\x3e\x8d\xc3\x75\xd2\xad\xd3\xae\xad\x36\xb8\x3f\x60\x49\x1d\x94\x12\xce\xc7\x2d\xbd\x1f\xf0\x1f\x59\xfe\xf9\xac\x86\x77\x56\x8b\x84\x7d\x34\xab\x43\x81\x20\xe4\x46\xb4\x98\xb8\x15\xda\x19\xed\x90\x4b\x74\xe4\x13\xff\x30\x9b\x8e\xe7\x16\x23\xff\x30\xcb\x0c\xb9\xfe\x39\x6b\x43\x2b\x3b\x94\x9b\xd5\x92\xa1\x13\xb5\x41\xb5\x5a\x16\xf0\xe3\xe8\xcd\xbe\xb7\x55\xc4\xe0\x53\xa5\x26\x91\x3c\x3a\x3f\x58\xb0\x72\x0d\x94\x7b\xe8\x83\x12\x84\xa7\x66\xa7\xa6\x35\xf6\x9b\x07\x30\x83\xd8\x83\xa0\xde\x8a\x5c\xc2\x1b\x8c\x0e\x4d\x49\xde\x9b\x74\x3b\xe6\xa1\xff\xdf\x31\xec\xdd\xa6\x71\x98\x99\x87\x4e\xd7\x01\x6e\x34\xf5\xc4\x86\xec\x46\xe9\x08\x65\x18\xdd\x1e\x30\x3c\x39\x1d\x02\x52\xfa\x26\x70\xae\xd2\xea\x50\xfe\x28\xaf\x26\x4c\xe5\x94\xe3\xff\x10\x21\xb6\x42\x9b\x61\x0f\x07\xc5\x6e\x87\x0b\xd8\xfd\xd5\x70\x85\x8d\xe8\x0d\x1d\x3f\x42\xc6\x41\xd9\xa4\xaf\xc8\x70\x2b\x88\x30\x5a\x9f\xe8\xe4\xf2\x6f\x61\x0e\x54\x70\xa7\x09\x2e\x58\x1e\xb9\xd5\x6c\x3e\x77\xdf\x2f\x17\x8b\x3c\x1a\xef\x76\xcf\xd8\x78\xb5\x1b\xbb\xc2\x5b\x93\x3b\x60\x6e\x72\x62\xec\x1c\x09\x3a\xb1\x45\xc8\x77\x54\x54\x3f\x0c\x64\xda\xb5\x43\xc5\x0f\xc4\x4b\xf6\x6f\x00\x00\x00\xff\xff\x1d\x87\x47\x5c\xd9\x0a\x00\x00") func provisionersProxyShBytes() ([]byte, error) { return bindataRead( @@ -424,7 +424,7 @@ func provisionersProxySh() (*asset, error) { } info := bindataFileInfo{name: "provisioners/proxy.sh", size: 0, mode: os.FileMode(0644), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x78, 0xee, 0xe1, 0xf6, 0xd3, 0xcb, 0x52, 0x5d, 0x68, 0x6f, 0x5c, 0x96, 0x55, 0x68, 0x96, 0xf3, 0x50, 0xc, 0x8e, 0x98, 0x1e, 0x89, 0xea, 0xf7, 0xee, 0xeb, 0x71, 0x42, 0xa0, 0x6c, 0xed, 0x28}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd, 0xfd, 0x53, 0xa8, 0x7e, 0xc4, 0xef, 0xd7, 0xcf, 0x9a, 0xe4, 0xe1, 0xa3, 0x47, 0x41, 0xa, 0xcc, 0x92, 0xac, 0x77, 0xed, 0xb7, 0xef, 0xb0, 0xc6, 0x5, 0x55, 0x2b, 0x12, 0xba, 0xf8, 0x5f}} return a, nil } @@ -468,7 +468,7 @@ func samlIdpCrt() (*asset, error) { return a, nil } -var _variablesTf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x56\x4d\x73\xe2\x38\x10\xbd\xe7\x57\xa8\x9c\x4b\x72\x58\x8a\x7c\xd5\xee\x85\xe3\x5e\x76\x2f\x53\xf3\x07\x54\x2d\xb9\x31\x02\x59\xd2\x74\xcb\x10\x32\x95\xff\x3e\x65\x1b\x33\x26\x6e\x20\x35\x15\x8e\x7e\x4f\xaf\xa5\xa7\xd6\x6b\xb6\x40\x0e\x8c\x47\x55\x58\xdf\x70\x46\xd2\x01\x6a\x2c\xd4\xcf\x9b\xf7\x9b\x9b\x29\xb8\x4d\x56\xbb\xf2\x2c\xcc\x8d\x09\x98\xb5\x2b\xb9\xa5\x28\x95\xf7\x09\xd5\x42\x45\xb3\x46\x9b\xef\xda\x2f\x4a\x41\x4a\x6a\xa1\xbc\xe3\x7c\xc7\x99\x5c\xa8\xee\xbb\xcf\xeb\x68\xa4\xcf\x89\xe2\xeb\x5e\x02\xa0\xc2\x90\x25\x00\x3d\x70\x76\x96\x11\xc8\xae\x24\x42\x8d\x99\x9c\x65\x09\xda\xe0\xde\xfa\x08\x1b\x09\x2b\x21\x83\x01\x46\x09\x23\x2c\x9d\x20\xf8\x7e\x7f\x6a\x13\xa4\xa4\x21\x67\xb0\x2b\xed\xa0\xd6\x89\xe2\xd2\xf9\xa9\xd9\x2d\xcd\x05\xce\x10\x2c\x6a\x1b\x9b\x90\x2f\x53\x5a\x97\xa7\x8c\xd6\x9f\xab\x32\xa7\xa4\x91\xd0\xad\xfa\xf7\xc4\xc7\x61\x0d\x8f\x97\x23\x5f\x2b\x30\x66\x88\xdb\x44\xd6\x5b\x24\x76\x31\x48\x90\x25\x84\x8c\x9a\xa2\xe0\x12\xb2\xe6\x00\x89\x57\x31\x6b\xc2\x14\xd9\xe5\x48\x7b\x89\xf6\x16\x03\x6a\xd8\x01\x61\x40\x66\x8d\xa1\x45\xa6\x4d\x3c\x66\x76\x44\xd8\x82\xf3\x60\x9c\x77\x79\xdf\x43\xe3\x43\xde\xaa\x6f\x5d\x6f\x32\xd2\x16\x69\x2c\xd4\xf5\xac\xe0\xcc\xf1\x3d\x84\xa6\x36\x48\xbd\xc8\xf7\xae\x75\x44\x7b\xbb\xae\x3a\xbb\xdd\x1e\x0d\xb1\x3c\xe3\x6c\x8f\x27\x20\xa8\x75\x45\xb1\x49\xf2\xcb\x1e\x8a\x54\x2e\xe0\xd9\xab\xf8\x70\x22\xb1\x5e\x69\xae\x35\xc3\x98\xd1\x17\xbc\x2c\xe2\x81\x59\x62\x0c\x69\xe3\x4a\x0c\xd9\x2d\x1d\x92\xc4\x2a\x71\x09\x8d\xcf\xc2\xd1\x8e\xf7\x50\x43\xba\x83\xb0\x6f\x9f\xea\x81\xad\x16\xaa\x4f\xa9\x02\x1a\x8a\x04\x7f\xd5\x7b\xfe\xe1\x0b\xd5\xfd\x16\xaa\xf8\x67\x36\x9f\x75\x9f\x74\x8f\xcf\x9e\x66\xf3\x97\xd9\x63\x71\xb2\x26\x45\xce\x15\x61\xb7\x70\xa1\x8a\x87\xe7\xd9\xdf\x2d\xe1\x7d\xb2\xc5\x86\x91\xc4\x4b\x29\x8d\x4e\xc0\xbc\x8b\x34\xbd\xf7\xd2\x1c\x5a\x42\x27\xa4\x65\xa4\xba\x33\xcb\x05\x76\xd5\x2a\x8b\x7e\x75\x3d\x80\x19\xe9\x34\x95\xbb\xb0\x6a\x2d\x38\x04\xd6\x87\xb0\x62\x5e\xe9\xd4\x18\xef\xac\xde\xe0\xf4\x5d\xd5\x90\x33\x52\x1d\x39\x6b\xef\x2c\x06\x46\x2d\x86\x99\xf1\xd1\x6e\x74\x89\x5b\x37\x6a\x9c\xc3\x1e\x3a\x4f\xfb\xea\x27\x57\x50\x54\xe9\xa9\xb8\x20\xc3\xee\x0d\x59\x77\xe1\xf5\x51\xed\xf0\xb4\xc6\x6a\x0f\xf3\xab\x52\x5d\x7f\x7f\x8d\x14\xa4\xf4\x35\x42\x87\x31\xf5\x09\xb1\x97\xeb\x62\xeb\x68\xbe\x46\xe8\x64\xba\x7e\x42\xf2\x71\xde\xc7\xdc\xff\xc3\x64\xfd\x9d\x74\x17\xeb\x0c\x93\xf8\x0f\xbc\x1c\x96\x8e\x93\xf3\xd8\xf4\x26\x46\x7f\x86\x7e\x39\xde\x8e\xb4\x69\x90\x9c\x6d\xe3\xc7\xe7\xd9\xbc\x0d\x07\x59\xa8\xc4\x2d\xfa\x98\xea\x76\x04\xd7\xb1\x44\x71\x9f\xb7\xea\xbf\x68\x0e\x33\x46\xf4\x6e\x1d\x8d\xee\xe1\x6b\xf1\x2b\x31\xc5\xa3\xf2\x93\x36\x8d\xdd\x60\xd6\x65\x53\x27\xdd\x90\x93\x28\xf8\x9a\xdb\xf4\xf2\x03\x57\x0c\x32\xd8\xf1\xf9\xbf\x39\x3b\xd6\x84\x95\x34\x6f\x5a\x08\xea\x69\x59\xdb\x70\x8e\xb5\xce\x50\xf1\x24\xc8\x87\xbf\x5d\x53\xa1\xb7\x69\x78\xf5\x6f\x4b\xf2\xe1\x57\x00\x00\x00\xff\xff\x8f\x51\xca\x53\x11\x0b\x00\x00") +var _variablesTf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x56\xcd\x6e\xf3\x36\x10\xbc\xe7\x29\x08\xe5\x92\xef\x50\xc3\xf9\x43\x7b\xf1\xb1\x97\xf6\x52\xf4\x05\x88\xa5\xb4\x96\x69\x53\x24\xbb\x4b\xd9\x71\x8a\xbc\x7b\x21\x4a\x72\xe5\x68\x6d\x07\x1f\xa2\x23\x67\x38\x24\x87\xcb\x59\xed\x81\x2c\x18\x87\xaa\x28\x5d\xcb\x09\x49\x7b\x68\xb0\x50\xff\xde\x7d\xdc\xdd\xcd\xc1\x7d\x2c\xb5\xad\x2e\xc2\xdc\x1a\x8f\x49\xdb\x8a\x3b\x8a\x52\xe9\x18\x51\xad\x54\x30\x5b\x2c\xd3\x43\x37\xa2\x14\xc4\xa8\x56\xca\x59\x4e\x0f\x9c\xc8\xfa\xfa\x47\x1e\xde\x06\x23\x0d\x47\x0a\x6f\x47\x09\x80\x1a\x7d\x92\x00\x74\xc0\xc9\x96\x8c\x40\xe5\x46\x22\x34\x98\xc8\x96\x2c\x41\x3b\x3c\x96\x2e\xc0\x4e\xc2\x2a\x48\x60\x80\x51\xc2\x08\x2b\x2b\x08\x7e\xfc\x38\xb7\x09\x62\xd4\x90\x12\x94\x1b\x6d\xa1\xd1\x91\xc2\xda\xba\xb9\xd9\x1d\xcd\x7a\x4e\xe0\x4b\xd4\x65\x68\x7d\xba\x4e\xe9\x5c\x9e\x33\x3a\x7f\x6e\xca\x9c\x93\x26\x42\xf7\xea\xf7\x33\x1f\xc7\x39\x3c\x9d\x8e\x7c\x6b\x81\x29\x43\xdc\x26\xb2\xde\x23\xb1\x0d\x5e\x82\x4a\x42\x48\xa8\x29\x08\x2e\x21\x6b\xf6\x10\x79\x13\x92\x26\x8c\x81\x6d\x0a\x74\x94\x68\xef\xc1\xa3\x86\x03\x10\x7a\x64\xd6\xe8\x3b\x64\x5e\xc4\x53\x66\x26\xc2\x1e\xac\x03\x63\x9d\x4d\xc7\x1e\x9a\x1e\xf2\x5e\xfd\x95\x6b\x93\x91\xf6\x48\x53\xa1\x5c\xb3\x82\x33\xa7\xf7\xe0\xdb\xc6\x20\xf5\x22\x7f\xe7\xd2\x11\xed\xcd\x55\x75\x71\xbb\x3d\xea\x43\x75\xc1\xd9\x1e\x8f\x40\xd0\xe8\x9a\x42\x1b\xe5\x97\x3d\x2e\x52\x5b\x8f\x17\xaf\xe2\xd3\x89\xc4\xf5\x2a\x73\xab\x18\xa6\x8c\x7e\xc1\xeb\x22\x0e\x98\x25\xc6\x98\x36\xb6\x42\x9f\xec\xda\x22\x49\xac\x0a\xd7\xd0\xba\x24\x1c\xed\x74\x0f\x0d\xc4\x07\xf0\xc7\xee\xa9\x0e\x6c\xb5\x52\x7d\x4a\x15\xd0\x52\x20\xf8\xa5\x39\xf2\x3f\xae\x50\xf9\x5b\xa9\xe2\xb7\xc5\x72\x91\x87\x74\x8f\x2f\x9e\x17\xcb\xd7\xc5\x53\x71\x36\x27\x06\x4e\x35\x61\x9e\xb8\x52\xc5\xe3\xcb\xe2\xd7\x8e\xf0\x31\xdb\x62\xcb\x48\xe2\xa5\x54\x46\x47\x60\x3e\x04\x9a\xdf\x7b\x65\x86\x92\xd0\x11\x69\x1d\xa8\xc9\x66\x59\xcf\xb6\xde\x24\xd1\xaf\x5c\x03\x98\x90\xce\x53\x39\x87\x55\x67\xc1\x10\x58\x9f\xc2\x8a\x79\xa3\x63\x6b\x9c\x2d\xf5\x0e\xe7\xef\xaa\x81\x94\x90\x9a\xc0\x49\x3b\x5b\xa2\x67\xd4\x62\x98\x19\x17\xca\x9d\xae\x70\x6f\x27\x85\x33\xec\x21\x7b\xda\xaf\x7e\x76\x05\x45\x1d\x9f\x8b\x2b\x32\x6c\xdf\x91\x75\x0e\xaf\xcf\x6a\xc3\xd3\x9a\xaa\x3d\x2e\x6f\x4a\xe5\xfa\xfe\x1e\x29\x88\xf1\x7b\x84\x86\x36\xf5\x05\xb1\xd7\xdb\x62\xdb\x60\xbe\x47\xe8\xac\xbb\x7e\x41\xf2\x69\xd9\xc7\xdc\x9f\x63\x67\xfd\x3f\xe9\xae\xae\x33\x76\xe2\x9f\xf0\x72\x9c\x3a\x4d\xce\x53\xd1\x9b\x10\xdc\x05\xfa\xf5\x78\x3b\xd1\xe6\x41\x72\xb1\x8c\x9f\x5e\x16\xcb\x2e\x1c\x64\xa1\x0a\xf7\xe8\x42\x6c\xba\x16\xdc\x84\x0a\xc5\x7d\xde\xab\x3f\x82\x19\x7a\x8c\xe8\xdd\x36\x18\xdd\xc3\xb7\xe2\x57\x62\x8a\x47\xe5\x67\x6d\xda\x72\x87\x49\x57\x6d\x13\x75\x4b\x56\xa2\xe0\x5b\xea\xd2\xcb\x8d\x5c\x31\xc8\xe0\xc0\x97\x7f\x73\x0e\xac\x09\x6b\xa9\xdf\x74\x10\x34\xf3\x65\x87\xf1\x1c\x9c\xf3\x9f\xd0\x96\x53\x68\x74\x82\x9a\x67\x29\x3f\xfe\x93\xcd\xd5\xde\xe7\xc9\xd6\x3f\x3c\xc9\xa4\xff\x02\x00\x00\xff\xff\x59\xc7\x28\xf8\x2e\x0b\x00\x00") func variablesTfBytes() ([]byte, error) { return bindataRead( @@ -484,7 +484,7 @@ func variablesTf() (*asset, error) { } info := bindataFileInfo{name: "variables.tf", size: 0, mode: os.FileMode(0644), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xbe, 0xec, 0x4c, 0xdc, 0x4b, 0xfa, 0xc9, 0xe2, 0xe9, 0x98, 0xb6, 0x87, 0xa, 0xff, 0x4c, 0x1d, 0x7, 0x62, 0xb1, 0x7e, 0x0, 0x82, 0x7, 0x9a, 0x44, 0xa6, 0x73, 0xd7, 0xb4, 0xce, 0x9b, 0xd4}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x31, 0x21, 0x5e, 0xf8, 0x6a, 0x15, 0xba, 0x2a, 0xb9, 0x22, 0x17, 0xd8, 0x4a, 0xb9, 0xc6, 0x9f, 0x60, 0x81, 0x16, 0x4a, 0xd5, 0x6d, 0xa3, 0xe8, 0x84, 0x4f, 0x46, 0x92, 0x18, 0x46, 0x16, 0x79}} return a, nil } diff --git a/deployment/terraform/assets/cluster.tf b/deployment/terraform/assets/cluster.tf index a1459a63a..faae91d48 100644 --- a/deployment/terraform/assets/cluster.tf +++ b/deployment/terraform/assets/cluster.tf @@ -50,7 +50,7 @@ resource "aws_instance" "app_server" { connection { # The default username for our AMI type = "ssh" - user = "ubuntu" + user = var.aws_ami_user # BRANCH: Use private IP (using private subnet) host = self.private_ip } @@ -75,7 +75,7 @@ resource "aws_instance" "app_server" { provisioner "file" { source = var.mattermost_license_file - destination = "/home/ubuntu/mattermost.mattermost-license" + destination = "/home/${var.aws_ami_user}/mattermost.mattermost-license" } provisioner "remote-exec" { @@ -148,7 +148,7 @@ resource "aws_instance" "metrics_server" { connection { # The default username for our AMI type = "ssh" - user = "ubuntu" + user = var.aws_ami_user # BRANCH: Use private IP (using private subnet) host = self.private_ip } @@ -201,7 +201,7 @@ resource "aws_instance" "proxy_server" { connection { # The default username for our AMI type = "ssh" - user = "ubuntu" + user = var.aws_ami_user # BRANCH: Use private IP (using private subnet) host = self.private_ip } @@ -363,7 +363,7 @@ resource "aws_instance" "loadtest_agent" { connection { type = "ssh" - user = "ubuntu" + user = var.aws_ami_user # BRANCH: Use private IP (using private subnet) host = self.private_ip } @@ -709,7 +709,7 @@ resource "aws_instance" "job_server" { connection { # The default username for our AMI type = "ssh" - user = "ubuntu" + user = var.aws_ami_user # BRANCH: Use private IP (using private subnet) host = self.private_ip } @@ -732,7 +732,7 @@ resource "aws_instance" "job_server" { provisioner "file" { source = var.mattermost_license_file - destination = "/home/ubuntu/mattermost.mattermost-license" + destination = "/home/${var.aws_ami_user}/mattermost.mattermost-license" } provisioner "remote-exec" { @@ -753,7 +753,7 @@ resource "null_resource" "s3_dump" { } // Keycloak -resource "aws_instance" "keycloak" { +resource "aws_instance" "keycloak_server" { tags = { Name = "${var.cluster_name}-keycloak" } @@ -761,7 +761,7 @@ resource "aws_instance" "keycloak" { connection { # The default username for our AMI type = "ssh" - user = "ubuntu" + user = var.aws_ami_user host = self.private_dns } diff --git a/deployment/terraform/assets/datasource.yaml b/deployment/terraform/assets/datasource.yaml index 5a3e41800..e1cf8a5fb 100644 --- a/deployment/terraform/assets/datasource.yaml +++ b/deployment/terraform/assets/datasource.yaml @@ -8,11 +8,12 @@ datasources: type: prometheus access: proxy orgId: 1 - url: %s + url: http://localhost:9090 isDefault: true version: 1 editable: true jsonData: + httpMethod: GET timeInterval: "5s" - name: Loki type: loki diff --git a/deployment/terraform/assets/outputs.tf b/deployment/terraform/assets/outputs.tf index ae4100ee2..f27e4c3bb 100644 --- a/deployment/terraform/assets/outputs.tf +++ b/deployment/terraform/assets/outputs.tf @@ -15,7 +15,7 @@ output "metricsServer" { } output "keycloakServer" { - value = aws_instance.keycloak + value = aws_instance.keycloak_server } output "proxy" { @@ -51,4 +51,3 @@ output "dbSecurityGroup" { output "jobServers" { value = aws_instance.job_server[*] } - diff --git a/deployment/terraform/assets/provisioners/agent.sh b/deployment/terraform/assets/provisioners/agent.sh index 385bb66dd..a00c2488c 100644 --- a/deployment/terraform/assets/provisioners/agent.sh +++ b/deployment/terraform/assets/provisioners/agent.sh @@ -5,22 +5,41 @@ set -euo pipefail # Wait for boot to be finished (e.g. networking to be up). while [ ! -f /var/lib/cloud/instance/boot-finished ]; do echo 'Waiting for cloud-init...'; sleep 1; done +system_arch=$(uname -m) +if [ "$system_arch" == "x86_64" ]; then + arch="amd64" +fi +prometheus_node_exporter_version="1.8.2" +otel_collector_version="0.110.0" + +function install_prometheus_node_exporter() { + echo "Installing Prometheus Node Exporter" + wget https://github.com/prometheus/node_exporter/releases/download/v${prometheus_node_exporter_version}/node_exporter-${prometheus_node_exporter_version}.linux-${arch}.tar.gz && \ + tar xvfz node_exporter-${prometheus_node_exporter_version}.linux-${arch}.tar.gz && \ + sudo cp node_exporter-${prometheus_node_exporter_version}.linux-${arch}/node_exporter /usr/local/bin +} + +function install_otel_collector() { + echo "Installing OpenTelemetry Collector" + wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v${otel_collector_version}/otelcol-contrib_${otel_collector_version}_linux_${arch}.rpm && \ + sudo rpm -i otelcol-contrib_${otel_collector_version}_linux_${arch}.rpm && \ + sudo sed -i "s/User=.*/User=$(whoami)/g" /lib/systemd/system/otelcol-contrib.service && \ + sudo sed -i "s/Group=.*/Group=$(whoami)/g" /lib/systemd/system/otelcol-contrib.service && \ + sudo systemctl daemon-reload && \ + sudo systemctl restart otelcol-contrib +} + # Retry loop (up to 3 times) n=0 until [ "$n" -ge 3 ] do # Note: commands below are expected to be either idempotent or generally safe to be run more than once. echo "Attempt ${n}" - sudo apt-get -y update && \ - sudo apt-get install -y prometheus-node-exporter && \ - sudo apt-get install -y numactl linux-tools-aws linux-tools-aws-lts-22.04 && \ - # Install OpenTelemetry collector, using ubuntu user to avoid permission issues - wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.110.0/otelcol-contrib_0.110.0_linux_amd64.deb && \ - sudo dpkg -i otelcol-contrib_0.110.0_linux_amd64.deb && \ - sudo sed -i 's/User=.*/User=ubuntu/g' /lib/systemd/system/otelcol-contrib.service && \ - sudo sed -i 's/Group=.*/Group=ubuntu/g' /lib/systemd/system/otelcol-contrib.service && \ - sudo mkdir -p /etc/otelcol-contrib && \ - sudo systemctl daemon-reload && sudo systemctl restart otelcol-contrib && \ + sudo dnf -y update && \ + sudo dnf -y install numactl kernel-tools && \ + sudo dnf -y install wget && \ + install_prometheus_node_exporter && \ + install_otel_collector && \ exit 0 n=$((n+1)) sleep 2 diff --git a/deployment/terraform/assets/provisioners/app.sh b/deployment/terraform/assets/provisioners/app.sh index e207e99f1..7e0835ca6 100644 --- a/deployment/terraform/assets/provisioners/app.sh +++ b/deployment/terraform/assets/provisioners/app.sh @@ -5,30 +5,56 @@ set -euo pipefail # Wait for boot to be finished (e.g. networking to be up). while [ ! -f /var/lib/cloud/instance/boot-finished ]; do echo 'Waiting for cloud-init...'; sleep 1; done +system_arch=$(uname -m) +if [ "$system_arch" == "x86_64" ]; then + arch="amd64" +fi +postgresql_version="14" +prometheus_node_exporter_version="1.8.2" +netpeek_version="0.1.4" +otel_collector_version="0.110.0" + +function install_prometheus_node_exporter() { + echo "Installing Prometheus Node Exporter" + wget https://github.com/prometheus/node_exporter/releases/download/v${prometheus_node_exporter_version}/node_exporter-${prometheus_node_exporter_version}.linux-${arch}.tar.gz && \ + tar xvfz node_exporter-${prometheus_node_exporter_version}.linux-${arch}.tar.gz && \ + sudo cp node_exporter-${prometheus_node_exporter_version}.linux-${arch}/node_exporter /usr/local/bin +} + +function install_otel_collector() { + echo "Installing OpenTelemetry Collector" + wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v${otel_collector_version}/otelcol-contrib_${otel_collector_version}_linux_${arch}.rpm && \ + sudo rpm -i otelcol-contrib_${otel_collector_version}_linux_${arch}.rpm && \ + sudo sed -i "s/User=.*/User=$(whoami)/g" /lib/systemd/system/otelcol-contrib.service && \ + sudo sed -i "s/Group=.*/Group=$(whoami)/g" /lib/systemd/system/otelcol-contrib.service && \ + sudo systemctl daemon-reload && \ + sudo systemctl restart otelcol-contrib +} + +function install_netpeek() { + wget https://github.com/streamer45/netpeek/releases/download/v${netpeek_version}/netpeek-v${netpeek_version} && \ + sudo mv netpeek-v* /usr/local/bin/netpeek && \ + sudo chmod +x /usr/local/bin/netpeek +} + # Retry loop (up to 3 times) n=0 until [ "$n" -ge 3 ] do # Note: commands below are expected to be either idempotent or generally safe to be run more than once. echo "Attempt ${n}" - echo 'tcp_bbr' | sudo tee -a /etc/modules && \ + echo 'tcp_bbr' | sudo tee -a /etc/modules-load.d/tcp_bbr.conf && \ sudo modprobe tcp_bbr && \ - wget -qO - https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgres-archive-keyring.gpg && \ - sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgres-archive-keyring.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' && \ - sudo apt-get -y update && \ - sudo apt-get install -y mysql-client-8.0 && \ - sudo apt-get install -y postgresql-client-14 && \ - sudo apt-get install -y prometheus-node-exporter && \ - sudo apt-get install -y numactl linux-tools-aws linux-tools-aws-lts-22.04 && \ - wget https://github.com/streamer45/netpeek/releases/download/v0.1.4/netpeek-v0.1.4 && \ - sudo mv netpeek-v* /usr/local/bin/netpeek && sudo chmod +x /usr/local/bin/netpeek && \ - # Install OpenTelemetry collector, using ubuntu user to avoid permission issues - wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.110.0/otelcol-contrib_0.110.0_linux_amd64.deb && \ - sudo dpkg -i otelcol-contrib_0.110.0_linux_amd64.deb && \ - sudo sed -i 's/User=.*/User=ubuntu/g' /lib/systemd/system/otelcol-contrib.service && \ - sudo sed -i 's/Group=.*/Group=ubuntu/g' /lib/systemd/system/otelcol-contrib.service && \ - sudo mkdir -p /etc/otelcol-contrib && \ - sudo systemctl daemon-reload && sudo systemctl restart otelcol-contrib && \ + sudo dnf -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm && \ + sudo dnf -y install postgresql${postgresql_version}-server && \ + sudo /usr/pgsql-${postgresql_version}/bin/postgresql-${postgresql_version}-setup initdb && \ + sudo systemctl enable --now postgresql-${postgresql_version} && \ + sudo dnf -y install wget && \ + sudo dnf -y install postgresql14 && \ + sudo dnf -y install numactl kernel-tools && \ + install_netpeek && \ + install_prometheus_node_exporter && \ + install_otel_collector && \ exit 0 n=$((n+1)) sleep 2 diff --git a/deployment/terraform/assets/provisioners/job.sh b/deployment/terraform/assets/provisioners/job.sh index bf612543e..a481d171a 100644 --- a/deployment/terraform/assets/provisioners/job.sh +++ b/deployment/terraform/assets/provisioners/job.sh @@ -5,20 +5,27 @@ set -euo pipefail # Wait for boot to be finished (e.g. networking to be up). while [ ! -f /var/lib/cloud/instance/boot-finished ]; do echo 'Waiting for cloud-init...'; sleep 1; done +system_arch=$(uname -m) +if [ "$system_arch" == "x86_64" ]; then + arch="amd64" +fi +postgresql_version="14" +prometheus_node_exporter_version="1.8.2" + # Retry loop (up to 3 times) n=0 until [ "$n" -ge 3 ] do # Note: commands below are expected to be either idempotent or generally safe to be run more than once. echo "Attempt ${n}" - wget -qO - https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgres-archive-keyring.gpg && \ - sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgres-archive-keyring.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' && \ - sudo apt-get -y update && \ - sudo apt-get install -y mysql-client-8.0 && \ - sudo apt-get install -y postgresql-client-14 && \ - sudo apt-get install -y prometheus-node-exporter && \ + sudo dnf -y update && \ + sudo dnf -y install postgresql${postgresql_version} && \ + sudo dnf -y install wget && \ + wget https://github.com/prometheus/node_exporter/releases/download/v${prometheus_node_exporter_version}/node_exporter-${prometheus_node_exporter_version}.linux-${arch}.tar.gz && \ + tar xvfz node_exporter-${prometheus_node_exporter_version}.linux-${arch}.tar.gz && \ + sudo cp node_exporter-${prometheus_node_exporter_version}.linux-${arch}/node_exporter /usr/local/bin && \ exit 0 - n=$((n+1)) + n=$((n+1)) sleep 2 done diff --git a/deployment/terraform/assets/provisioners/keycloak.sh b/deployment/terraform/assets/provisioners/keycloak.sh index c442916d0..5593c7e0f 100644 --- a/deployment/terraform/assets/provisioners/keycloak.sh +++ b/deployment/terraform/assets/provisioners/keycloak.sh @@ -6,7 +6,12 @@ set -euo pipefail while [ ! -f /var/lib/cloud/instance/boot-finished ]; do echo 'Waiting for cloud-init...'; sleep 1; done # Arguments +system_arch=$(uname -m) +if [ "$system_arch" == "x86_64" ]; then + arch="amd64" +fi keycloak_version=$1 +prometheus_node_exporter_version="1.8.2" # Retry loop (up to 3 times) n=0 @@ -14,15 +19,20 @@ until [ "$n" -ge 3 ] do # Note: commands below are expected to be either idempotent or generally safe to be run more than once. echo "Attempt ${n}" - sudo apt-get -y update && \ - sudo apt-get install unzip openjdk-17-jre postgresql postgresql-contrib -y && \ + sudo dnf -y update && \ + sudo dnf -y install unzip java-17-openjdk postgresql postgresql-server wget && \ + sudo /usr/bin/postgresql-setup --initdb && \ + sudo systemctl enable --now postgresql && \ sudo mkdir -p /opt/keycloak && \ sudo curl -O -L --output-dir /opt/keycloak https://github.com/keycloak/keycloak/releases/download/${keycloak_version}/keycloak-${keycloak_version}.zip && \ sudo unzip /opt/keycloak/keycloak-${keycloak_version}.zip -d /opt/keycloak && \ sudo mkdir -p /opt/keycloak/keycloak-${keycloak_version}/data/import && \ - sudo chown -R ubuntu:ubuntu /opt/keycloak && \ + sudo chown -R $(whoami):$(whoami) /opt/keycloak && \ + wget https://github.com/prometheus/node_exporter/releases/download/v${prometheus_node_exporter_version}/node_exporter-${prometheus_node_exporter_version}.linux-${arch}.tar.gz && \ + tar xvfz node_exporter-${prometheus_node_exporter_version}.linux-${arch}.tar.gz && \ + sudo cp node_exporter-${prometheus_node_exporter_version}.linux-${arch}/node_exporter /usr/local/bin && \ exit 0 - n=$((n+1)) + n=$((n+1)) sleep 2 done diff --git a/deployment/terraform/assets/provisioners/metrics.sh b/deployment/terraform/assets/provisioners/metrics.sh index 54831b7c2..f3ec2d102 100644 --- a/deployment/terraform/assets/provisioners/metrics.sh +++ b/deployment/terraform/assets/provisioners/metrics.sh @@ -5,46 +5,161 @@ set -euo pipefail # Wait for boot to be finished (e.g. networking to be up). while [ ! -f /var/lib/cloud/instance/boot-finished ]; do echo 'Waiting for cloud-init...'; sleep 1; done + +system_arch=$(uname -m) +if [ "$system_arch" == "x86_64" ]; then + arch="amd64" +fi + +wget_common_args="--no-clobber" + +grafana_version="10.2.3" +grafana_package="grafana" +prometheus_version="1.8.2" +prometheus_node_exporter_version="1.8.2" +inbucket_version="2.1.0" +elasticsearch_exporter_version="1.1.0" +redis_exporter_version="1.58.0" +alloy_version="1.3.1" +alloy_rev="1" +pyroscope_version="1.7.1" +pyroscope_rev="1" +yace_version="0.61.2" +loki_version="3.2.0" + +function install_deps() { + sudo dnf -y update && \ + sudo dnf -y install wget fontconfig +} + +function install_grafana { + echo "Installing Grafana" + wget ${wget_common_args} -O grafana-gpg.key https://rpm.grafana.com/gpg.key + sudo rpm --import grafana-gpg.key + sudo sh -c 'echo "[grafana] +name=grafana +baseurl=https://rpm.grafana.com +repo_gpgcheck=1 +enabled=1 +gpgcheck=1 +gpgkey=https://rpm.grafana.com/gpg.key +sslverify=1 +sslcacert=/etc/pki/tls/certs/ca-bundle.crt" > /etc/yum.repos.d/grafana.repo' && \ + sudo dnf -y install grafana-${grafana_version} && \ + sudo systemctl enable --now grafana-server +} + +function install_prometheus_node_exporter() { + echo "Installing Prometheus Node Exporter" + wget https://github.com/prometheus/node_exporter/releases/download/v${prometheus_node_exporter_version}/node_exporter-${prometheus_node_exporter_version}.linux-${arch}.tar.gz && \ + tar xvfz node_exporter-${prometheus_node_exporter_version}.linux-${arch}.tar.gz && \ + sudo cp node_exporter-${prometheus_node_exporter_version}.linux-${arch}/node_exporter /usr/local/bin +} + +function install_prometheus() { + echo "Installing Prometheus" + if ! id "prometheus"; then + sudo adduser --no-create-home --shell /bin/false prometheus; + fi; + sudo mkdir -p /etc/prometheus /var/lib/prometheus && \ + sudo chown prometheus:prometheus /etc/prometheus && \ + sudo chown prometheus:prometheus /var/lib/prometheus && \ + wget ${wget_common_args} https://github.com/prometheus/prometheus/releases/download/v${prometheus_version}/prometheus-${prometheus_version}.linux-${arch}.tar.gz && \ + tar -xzf prometheus-${prometheus_version}.linux-${arch}.tar.gz && \ + sudo cp prometheus-${prometheus_version}.linux-${arch}/prometheus /usr/local/bin/ && \ + sudo chown prometheus:prometheus /usr/local/bin/prometheus && \ + sudo cp prometheus-${prometheus_version}.linux-${arch}/promtool /usr/local/bin/ && \ + sudo chown prometheus:prometheus /usr/local/bin/promtool && \ + sudo cp -r prometheus-${prometheus_version}.linux-${arch}/consoles /etc/prometheus && \ + sudo cp -r prometheus-${prometheus_version}.linux-${arch}/console_libraries /etc/prometheus && \ + sudo chown -R prometheus:prometheus /etc/prometheus/consoles && \ + sudo chown -R prometheus:prometheus /etc/prometheus/console_libraries && \ + sudo sh -c 'echo "[Unit] +Description=Prometheus +Wants=network-online.target +After=network-online.target +[Service] +User=prometheus +Group=prometheus +Type=simple +ExecStart=/usr/local/bin/prometheus \ +--config.file /etc/prometheus/prometheus.yml \ +--storage.local.path /var/lib/prometheus/ \ +--web.console.templates=/etc/prometheus/consoles \ +--web.console.libraries=/etc/prometheus/console_libraries +[Install] +WantedBy=multi-user.target" > /etc/systemd/system/prometheus.service' && \ + sudo systemctl daemon-reload +} + +function install_inbucket() { + echo "Installing Inbucket" + wget ${wget_common_args} https://github.com/inbucket/inbucket/releases/download/v${inbucket_version}/inbucket_${inbucket_version}_linux_${arch}.rpm && \ + sudo dnf localinstall -y inbucket_${inbucket_version}_linux_${arch}.rpm && \ + sudo systemctl start --now inbucket +} + +function install_elasticsearch_exporter() { + echo "Installing Elasticsearch Exporter" + wget ${wget_common_args} https://github.com/justwatchcom/elasticsearch_exporter/releases/download/v${elasticsearch_exporter_version}/elasticsearch_exporter-${elasticsearch_exporter_version}.linux-${arch}.tar.gz && \ + sudo mkdir -p /opt/elasticsearch_exporter && \ + sudo tar -zxf elasticsearch_exporter-${elasticsearch_exporter_version}.linux-${arch}.tar.gz -C /opt/elasticsearch_exporter --strip-components=1 +} + +function install_redis_exporter() { + echo "Installing Redis Exporter" + wget ${wget_common_args} https://github.com/oliver006/redis_exporter/releases/download/v${redis_exporter_version}/redis_exporter-v${redis_exporter_version}.linux-${arch}.tar.gz && \ + sudo mkdir -p /opt/redis_exporter && \ + sudo tar -zxf redis_exporter-v${redis_exporter_version}.linux-${arch}.tar.gz -C /opt/redis_exporter --strip-components=1 +} + +function install_alloy() { + echo "Installing Alloy" + wget ${wget_common_args} https://github.com/grafana/alloy/releases/download/v${alloy_version}/alloy-${alloy_version}-${alloy_rev}.${arch}.rpm && \ + sudo dnf localinstall -y alloy-${alloy_version}-${alloy_rev}.${arch}.rpm && \ + sudo systemctl enable --now alloy +} + +function install_pyroscope() { + echo "Installing Pyroscope" + wget https://github.com/grafana/pyroscope/releases/download/v${pyroscope_version}/pyroscope_${pyroscope_version}_linux_${arch}.rpm && \ + sudo dnf localinstall -y pyroscope_${pyroscope_version}_linux_${arch}.rpm && \ + sudo mkdir -p /var/lib/pyroscope && \ + sudo chown pyroscope:pyroscope -R /var/lib/pyroscope && \ + sudo systemctl enable --now pyroscope +} + +function install_yace() { + echo "Installing Yace" + sudo mkdir -p /opt/yace && \ + wget https://github.com/nerdswords/yet-another-cloudwatch-exporter/releases/download/v${yace_version}/yet-another-cloudwatch-exporter_${yace_version}_Linux_${system_arch}.tar.gz && \ + sudo tar -zxf yet-another-cloudwatch-exporter_${yace_version}_Linux_${system_arch}.tar.gz -C /opt/yace +} + +function install_loki() { + echo "Installing Loki" + wget https://github.com/grafana/loki/releases/download/v${loki_version}/loki-${loki_version}.${system_arch}.rpm && \ + sudo rpm -i loki-${loki_version}.${system_arch}.rpm && \ + sudo systemctl start loki +} + # Retry loop (up to 3 times) n=0 -until [ "$n" -ge 3 ] +until [ "$n" -ge 1 ] do # Note: commands below are expected to be either idempotent or generally safe to be run more than once. echo "Attempt ${n}" - sudo apt-get -y update && \ - sudo apt-get install -y prometheus && \ - sudo systemctl enable prometheus && \ - sudo apt-get install -y adduser libfontconfig1 musl && \ - wget https://dl.grafana.com/oss/release/grafana_10.2.3_amd64.deb && \ - sudo dpkg -i grafana_10.2.3_amd64.deb && \ - wget https://github.com/inbucket/inbucket/releases/download/v2.1.0/inbucket_2.1.0_linux_amd64.deb && \ - sudo dpkg -i inbucket_2.1.0_linux_amd64.deb && \ - wget https://github.com/justwatchcom/elasticsearch_exporter/releases/download/v1.1.0/elasticsearch_exporter-1.1.0.linux-amd64.tar.gz && \ - sudo mkdir /opt/elasticsearch_exporter && \ - sudo tar -zxf elasticsearch_exporter-1.1.0.linux-amd64.tar.gz -C /opt/elasticsearch_exporter --strip-components=1 && \ - wget https://github.com/oliver006/redis_exporter/releases/download/v1.58.0/redis_exporter-v1.58.0.linux-amd64.tar.gz && \ - sudo mkdir /opt/redis_exporter && \ - sudo tar -zxf redis_exporter-v1.58.0.linux-amd64.tar.gz -C /opt/redis_exporter --strip-components=1 && \ - sudo systemctl daemon-reload && \ - sudo systemctl enable grafana-server && \ - sudo service grafana-server start && \ - sudo systemctl enable inbucket && \ - sudo service inbucket start && \ - wget https://github.com/grafana/alloy/releases/download/v1.3.1/alloy-1.3.1-1.amd64.deb && \ - sudo dpkg -i alloy-1.3.1-1.amd64.deb && \ - sudo systemctl enable alloy && \ - wget https://github.com/grafana/pyroscope/releases/download/v1.7.1/pyroscope_1.7.1_linux_amd64.deb && \ - sudo dpkg -i pyroscope_1.7.1_linux_amd64.deb && \ - sudo mkdir -p /var/lib/pyroscope && \ - sudo chown pyroscope:pyroscope -R /var/lib/pyroscope && \ - sudo systemctl enable pyroscope && \ - sudo mkdir /opt/yace && \ - wget https://github.com/nerdswords/yet-another-cloudwatch-exporter/releases/download/v0.61.2/yet-another-cloudwatch-exporter_0.61.2_Linux_x86_64.tar.gz && \ - sudo tar -zxf yet-another-cloudwatch-exporter_0.61.2_Linux_x86_64.tar.gz -C /opt/yace && \ - # Install Loki - wget https://github.com/grafana/loki/releases/download/v3.2.0/loki_3.2.0_amd64.deb && \ - sudo dpkg -i loki_3.2.0_amd64.deb && \ - sudo systemctl start loki + install_deps && \ + install_grafana && \ + install_prometheus && \ + install_prometheus_node_exporter && \ + install_inbucket && \ + install_elasticsearch_exporter && \ + install_redis_exporter && \ + install_alloy && \ + install_pyroscope && \ + install_yace && \ + install_loki && \ exit 0 n=$((n+1)) sleep 2 diff --git a/deployment/terraform/assets/provisioners/proxy.sh b/deployment/terraform/assets/provisioners/proxy.sh index de721ae6c..09426932d 100644 --- a/deployment/terraform/assets/provisioners/proxy.sh +++ b/deployment/terraform/assets/provisioners/proxy.sh @@ -5,36 +5,61 @@ set -euo pipefail # Wait for boot to be finished (e.g. networking to be up). while [ ! -f /var/lib/cloud/instance/boot-finished ]; do echo 'Waiting for cloud-init...'; sleep 1; done +system_arch=$(uname -m) +if [ "$system_arch" == "x86_64" ]; then + arch="amd64" +fi +prometheus_node_exporter_version="1.8.2" +netpeek_version="0.1.4" +otel_collector_version="0.110.0" + +function install_prometheus_node_exporter() { + echo "Installing Prometheus Node Exporter" + wget https://github.com/prometheus/node_exporter/releases/download/v${prometheus_node_exporter_version}/node_exporter-${prometheus_node_exporter_version}.linux-${arch}.tar.gz && \ + tar xvfz node_exporter-${prometheus_node_exporter_version}.linux-${arch}.tar.gz && \ + sudo cp node_exporter-${prometheus_node_exporter_version}.linux-${arch}/node_exporter /usr/local/bin +} + +function install_otel_collector() { + echo "Installing OpenTelemetry Collector" + wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v${otel_collector_version}/otelcol-contrib_${otel_collector_version}_linux_${arch}.rpm && \ + sudo rpm -i otelcol-contrib_${otel_collector_version}_linux_${arch}.rpm && \ + sudo sed -i "s/User=.*/User=$(whoami)/g" /lib/systemd/system/otelcol-contrib.service && \ + sudo sed -i "s/Group=.*/Group=$(whoami)/g" /lib/systemd/system/otelcol-contrib.service && \ + sudo systemctl daemon-reload && \ + sudo systemctl restart otelcol-contrib +} + # Retry loop (up to 3 times) n=0 until [ "$n" -ge 3 ] do # Note: commands below are expected to be either idempotent or generally safe to be run more than once. echo "Attempt ${n}" - echo 'tcp_bbr' | sudo tee -a /etc/modules && \ + echo 'tcp_bbr' | sudo tee /etc/modules-load.d/tcp_bbr.conf && \ sudo modprobe tcp_bbr && \ - wget -qO - https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/nginx.gpg && \ - sudo sh -c 'echo "deb [arch=amd64] http://nginx.org/packages/mainline/ubuntu/ $(lsb_release -cs) nginx" > /etc/apt/sources.list.d/nginx.list' && \ - sudo sh -c 'echo "deb-src http://nginx.org/packages/mainline/ubuntu/ $(lsb_release -cs) nginx" >> /etc/apt/sources.list.d/nginx.list' && \ - sudo apt-get -y update && \ - sudo apt-get install -y nginx && \ - sudo apt-get install -y prometheus-node-exporter && \ - sudo apt-get install -y numactl linux-tools-aws linux-tools-aws-lts-22.04 && \ + sudo rpm --import https://nginx.org/keys/nginx_signing.key && \ + sudo sh -c 'echo "[nginx] +name=nginx +baseurl=https://nginx.org/packages/mainline/centos/\$releasever/\$basearch/ +gpgcheck=1 +enabled=1" > /etc/yum.repos.d/nginx.repo' && \ + sudo dnf -y update && \ + sudo dnf -y install wget && \ + sudo dnf -y install nginx && \ + sudo dnf -y install numactl kernel-tools && \ + install_prometheus_node_exporter && \ + install_otel_collector && \ sudo systemctl daemon-reload && \ sudo systemctl enable nginx && \ sudo mkdir -p /etc/nginx/snippets && \ - sudo mkdir -p /etc/nginx/sites-available && \ + sudo mkdir -p /etc/nginx/conf.d && \ sudo mkdir -p /etc/nginx/sites-enabled && \ - sudo rm -f /etc/nginx/sites-enabled/default && \ - sudo ln -fs /etc/nginx/sites-available/mattermost /etc/nginx/sites-enabled/mattermost && \ - # Install OpenTelemetry collector, using ubuntu user to avoid permission issues - wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.110.0/otelcol-contrib_0.110.0_linux_amd64.deb && \ - sudo dpkg -i otelcol-contrib_0.110.0_linux_amd64.deb && \ - sudo sed -i 's/User=.*/User=ubuntu/g' /lib/systemd/system/otelcol-contrib.service && \ - sudo sed -i 's/Group=.*/Group=ubuntu/g' /lib/systemd/system/otelcol-contrib.service && \ - sudo mkdir -p /etc/otelcol-contrib && \ - sudo systemctl daemon-reload && sudo systemctl restart otelcol-contrib && \ + sudo mkdir -p /etc/nginx/sites-available && \ + sudo rm -f /etc/nginx/conf.d/default.conf && \ + sudo ln -fs /etc/nginx/sites-available/mattermost /etc/nginx/sites-enabled/mattermost.conf && \ exit 0 + n=$((n+1)) sleep 2 done diff --git a/deployment/terraform/assets/variables.tf b/deployment/terraform/assets/variables.tf index abd821b5d..a025846cd 100644 --- a/deployment/terraform/assets/variables.tf +++ b/deployment/terraform/assets/variables.tf @@ -197,6 +197,9 @@ variable "aws_region" { variable "aws_ami" { } +variable "aws_ami_user" { +} + variable "custom_tags" { type = map(string) } diff --git a/deployment/terraform/coordinator.go b/deployment/terraform/coordinator.go index e668fab88..ce1e13627 100644 --- a/deployment/terraform/coordinator.go +++ b/deployment/terraform/coordinator.go @@ -44,7 +44,7 @@ func (t *Terraform) StartCoordinator(config *coordinator.Config) error { if err != nil { return err } - sshc, err := extAgent.NewClient(ip) + sshc, err := extAgent.NewClient(ip, t.Config().AWSAMIUser) if err != nil { return err } @@ -67,7 +67,7 @@ func (t *Terraform) StartCoordinator(config *coordinator.Config) error { return err } mlog.Info("Uploading updated coordinator config file") - dstPath := "/home/ubuntu/mattermost-load-test-ng/config/coordinator.json" + dstPath := fmt.Sprintf("/home/%s/mattermost-load-test-ng/config/coordinator.json", t.config.AWSAMIUser) if out, err := sshc.Upload(bytes.NewReader(data), dstPath, false); err != nil { return fmt.Errorf("error running ssh command: output: %s, error: %w", out, err) } @@ -100,15 +100,15 @@ func (t *Terraform) StartCoordinator(config *coordinator.Config) error { }{ { input: agentConfig, - dstPath: "/home/ubuntu/mattermost-load-test-ng/config/config.json", + dstPath: fmt.Sprintf("/home/%s/mattermost-load-test-ng/config/config.json", t.Config().AWSAMIUser), }, { input: simulConfig, - dstPath: "/home/ubuntu/mattermost-load-test-ng/config/simulcontroller.json", + dstPath: fmt.Sprintf("/home/%s/mattermost-load-test-ng/config/simulcontroller.json", t.Config().AWSAMIUser), }, { input: simpleConfig, - dstPath: "/home/ubuntu/mattermost-load-test-ng/config/simplecontroller.json", + dstPath: fmt.Sprintf("/home/%s/mattermost-load-test-ng/config/simplecontroller.json", t.Config().AWSAMIUser), }, } diff --git a/deployment/terraform/create.go b/deployment/terraform/create.go index 74b024c14..894e0b9fe 100644 --- a/deployment/terraform/create.go +++ b/deployment/terraform/create.go @@ -15,6 +15,7 @@ import ( "strconv" "strings" "sync" + "text/template" "time" "github.com/blang/semver" @@ -372,14 +373,14 @@ func (t *Terraform) Create(initData bool) error { func (t *Terraform) setupAppServers(extAgent *ssh.ExtAgent, uploadBinary bool, uploadRelease bool, uploadPath string, siteURL string) error { for _, val := range t.output.Instances { - err := t.setupMMServer(extAgent, val.PublicIP, siteURL, uploadBinary, uploadRelease, uploadPath, val.Tags.Name) + err := t.setupMMServer(extAgent, val.PrivateIP, siteURL, uploadBinary, uploadRelease, uploadPath, val.Tags.Name) if err != nil { return err } } for _, val := range t.output.JobServers { - err := t.setupJobServer(extAgent, val.PublicIP, siteURL, uploadBinary, uploadRelease, uploadPath, val.Tags.Name) + err := t.setupJobServer(extAgent, val.PrivateIP, siteURL, uploadBinary, uploadRelease, uploadPath, val.Tags.Name) if err != nil { return err } @@ -397,7 +398,7 @@ func (t *Terraform) setupJobServer(extAgent *ssh.ExtAgent, ip, siteURL string, u } func (t *Terraform) setupAppServer(extAgent *ssh.ExtAgent, ip, siteURL, serviceFile string, uploadBinary bool, uploadRelease bool, uploadPath string, jobServerEnabled bool, instanceName string) error { - sshc, err := extAgent.NewClient(ip) + sshc, err := extAgent.NewClient(ip, t.Config().AWSAMIUser) if err != nil { return fmt.Errorf("error in getting ssh connection to %q: %w", ip, err) } @@ -413,16 +414,34 @@ func (t *Terraform) setupAppServer(extAgent *ssh.ExtAgent, ip, siteURL, serviceF return fmt.Errorf("unable to render otelcol config template: %w", err) } + serviceFileTemplate, err := template.New("serviceFile").Parse(serviceFile) + if err != nil { + return fmt.Errorf("error parsing service file template: %w", err) + } + + var serviceFileTemplateOutput bytes.Buffer + err = serviceFileTemplate.Execute(&serviceFileTemplateOutput, map[string]string{ + "ServiceEnvironment": os.Getenv("MM_SERVICEENVIRONMENT"), + "User": t.Config().AWSAMIUser, + }) + if err != nil { + return fmt.Errorf("error executing service file template: %w", err) + } + // Upload files batch := []uploadInfo{ {srcData: strings.TrimPrefix(serverSysctlConfig, "\n"), dstPath: "/etc/sysctl.conf"}, - {srcData: strings.TrimSpace(fmt.Sprintf(serviceFile, os.Getenv("MM_SERVICEENVIRONMENT"))), dstPath: "/lib/systemd/system/mattermost.service"}, + {srcData: strings.TrimSpace(serviceFileTemplateOutput.String()), dstPath: "/lib/systemd/system/mattermost.service"}, {srcData: strings.TrimPrefix(limitsConfig, "\n"), dstPath: "/etc/security/limits.conf"}, {srcData: strings.TrimPrefix(prometheusNodeExporterConfig, "\n"), dstPath: "/etc/default/prometheus-node-exporter"}, {srcData: strings.TrimSpace(fmt.Sprintf(netpeekServiceFile, gossipPort)), dstPath: "/lib/systemd/system/netpeek.service"}, {srcData: strings.TrimSpace(otelcolConfig), dstPath: "/etc/otelcol-contrib/config.yaml"}, } + if err := t.setupPrometheusNodeExporter(sshc); err != nil { + return fmt.Errorf("error setting up prometheus node exporter: %w", err) + } + // If SiteURL is set, update /etc/hosts to point to the correct IP if t.config.SiteURL != "" { // Here it's fine to just use the first proxy because this is @@ -446,7 +465,7 @@ func (t *Terraform) setupAppServer(extAgent *ssh.ExtAgent, ip, siteURL, serviceF return fmt.Errorf("error running ssh command %q, output: %q: %w", cmd, string(out), err) } - cmd = "sudo systemctl daemon-reload && sudo service mattermost stop" + cmd = "sudo systemctl daemon-reload && sudo systemctl stop mattermost" if out, err := sshc.RunCommand(cmd); err != nil { return fmt.Errorf("error running ssh command %q, output: %q: %w", cmd, string(out), err) } @@ -457,7 +476,7 @@ func (t *Terraform) setupAppServer(extAgent *ssh.ExtAgent, ip, siteURL, serviceF mlog.Info("Uploading release from tar.gz file", mlog.String("host", ip)) filename := path.Base(uploadPath) - if out, err := sshc.UploadFile(uploadPath, "/home/ubuntu/"+filename, false); err != nil { + if out, err := sshc.UploadFile(uploadPath, fmt.Sprintf("/home/%s/%s", t.Config().AWSAMIUser, filename), false); err != nil { return fmt.Errorf("error uploading file %q, output: %q: %w", uploadPath, string(out), err) } commands = []string{ @@ -497,19 +516,37 @@ func (t *Terraform) setupAppServer(extAgent *ssh.ExtAgent, ip, siteURL, serviceF if t.config.EnableNetPeekMetrics { mlog.Info("Starting netpeek service", mlog.String("host", ip)) - cmd = "sudo systemctl daemon-reload && sudo chmod +x /usr/local/bin/netpeek && sudo service netpeek restart" + cmd = "sudo systemctl daemon-reload && sudo chmod +x /usr/local/bin/netpeek && sudo systemctl restart netpeek" if out, err := sshc.RunCommand(cmd); err != nil { return fmt.Errorf("error running ssh command %q, output: %q: %w", cmd, string(out), err) } } + // Ensure selinux is disabled for the service file to work properly having the binary outside + // the default binary directories + mlog.Info("Disabling SELinux", mlog.String("host", ip)) + cmd = "sudo setenforce 0" + if out, err := sshc.RunCommand(cmd); err != nil { + mlog.Error(string(out)) + return fmt.Errorf("error running ssh command %q, output: %q: %w", cmd, string(out), err) + } + // Starting mattermost. mlog.Info("Applying kernel settings and starting mattermost", mlog.String("host", ip)) - cmd = "sudo sysctl -p && sudo systemctl daemon-reload && sudo service mattermost restart" + cmd = "sudo sysctl -p && sudo systemctl daemon-reload && sudo systemctl restart mattermost" if out, err := sshc.RunCommand(cmd); err != nil { return fmt.Errorf("error running ssh command %q, output: %q: %w", cmd, string(out), err) } + // Check if systemd service is running + mlog.Info("Checking if mattermost service is running", mlog.String("host", ip), mlog.String("instance", instanceName)) + cmd = "sudo systemctl status mattermost" + out, err := sshc.RunCommand(cmd) + if err != nil { + mlog.Error(string(out)) + return fmt.Errorf("error running ssh command %q: %q, %w", cmd, out, err) + } + return nil } @@ -538,7 +575,7 @@ func (t *Terraform) setupElasticSearchServer(extAgent *ssh.ExtAgent, ip string) } esEndpoint := output.ElasticSearchServer.Endpoint - sshc, err := extAgent.NewClient(ip) + sshc, err := extAgent.NewClient(ip, t.Config().AWSAMIUser) if err != nil { return fmt.Errorf("unable to create SSH client with IP %q: %w", ip, err) } @@ -788,9 +825,9 @@ func (t *Terraform) getProxyInstanceInfo() (*types.InstanceTypeInfo, error) { } func (t *Terraform) setupProxyServer(extAgent *ssh.ExtAgent, instance Instance) { - ip := instance.PublicDNS + ip := instance.PrivateDNS - sshc, err := extAgent.NewClient(ip) + sshc, err := extAgent.NewClient(ip, t.Config().AWSAMIUser) if err != nil { mlog.Error("error in getting ssh connection", mlog.String("ip", ip), mlog.Err(err)) return @@ -804,6 +841,14 @@ func (t *Terraform) setupProxyServer(extAgent *ssh.ExtAgent, instance Instance) } }() + // Ensure selinux is disabled for the connection from nginx to the upstream servers to work + mlog.Info("Disabling SELinux", mlog.String("host", ip)) + cmd := "sudo setenforce 0" + if out, err := sshc.RunCommand(cmd); err != nil { + mlog.Error("error running ssh command %q, output: %q: %w", mlog.String("cmd", cmd), mlog.String("out", out), mlog.Err(err)) + return + } + // Upload service file mlog.Info("Uploading nginx config", mlog.String("host", ip)) @@ -855,6 +900,14 @@ func (t *Terraform) setupProxyServer(extAgent *ssh.ExtAgent, instance Instance) return } + otelcolConfigFile, err := fillConfigTemplate(otelcolConfig, map[string]any{ + "User": t.Config().AWSAMIUser, + }) + if err != nil { + mlog.Error("Failed to generate otelcol config", mlog.Err(err)) + return + } + batch := []uploadInfo{ {srcData: strings.TrimLeft(nginxProxyCommonConfig, "\n"), dstPath: "/etc/nginx/snippets/proxy.conf"}, {srcData: strings.TrimLeft(nginxCacheCommonConfig, "\n"), dstPath: "/etc/nginx/snippets/cache.conf"}, @@ -863,21 +916,25 @@ func (t *Terraform) setupProxyServer(extAgent *ssh.ExtAgent, instance Instance) {srcData: strings.TrimLeft(nginxConfig, "\n"), dstPath: "/etc/nginx/nginx.conf"}, {srcData: strings.TrimLeft(limitsConfig, "\n"), dstPath: "/etc/security/limits.conf"}, {srcData: strings.TrimPrefix(prometheusNodeExporterConfig, "\n"), dstPath: "/etc/default/prometheus-node-exporter"}, - {srcData: strings.TrimSpace(otelcolConfig), dstPath: "/etc/otelcol-contrib/config.yaml"}, + {srcData: strings.TrimSpace(otelcolConfigFile), dstPath: "/etc/otelcol-contrib/config.yaml"}, } if err := uploadBatch(sshc, batch); err != nil { mlog.Error("batch upload failed", mlog.Err(err)) return } - cmd := "sudo systemctl restart otelcol-contrib" + if err := t.setupPrometheusNodeExporter(sshc); err != nil { + mlog.Error("error setting up prometheus node exporter", mlog.Err(err), mlog.String("host", ip), mlog.String("instance", instance.Tags.Name)) + } + + cmd = "sudo systemctl restart otelcol-contrib" if out, err := sshc.RunCommand(cmd); err != nil { mlog.Error("error running ssh command", mlog.String("output", string(out)), mlog.String("cmd", cmd), mlog.Err(err)) return } incRXSizeCmd := fmt.Sprintf("sudo ethtool -G $(ip route show to default | awk '{print $5}') rx %d", rxQueueSize) - cmd = fmt.Sprintf("%s && sudo sysctl -p && sudo service nginx restart", incRXSizeCmd) + cmd = fmt.Sprintf("%s && sudo sysctl -p && sudo systemctl restart nginx", incRXSizeCmd) if out, err := sshc.RunCommand(cmd); err != nil { mlog.Error("error running ssh command", mlog.String("output", string(out)), mlog.String("cmd", cmd), mlog.Err(err)) return @@ -892,7 +949,7 @@ func (t *Terraform) createAdminUser(extAgent *ssh.ExtAgent) error { t.config.AdminPassword, ) mlog.Info("Creating admin user:", mlog.String("cmd", cmd)) - sshc, err := extAgent.NewClient(t.output.Instances[0].PrivateIP) + sshc, err := extAgent.NewClient(t.output.Instances[0].PrivateIP, t.Config().AWSAMIUser) if err != nil { return err } @@ -918,7 +975,7 @@ func (t *Terraform) updatePostgresSettings(extAgent *ssh.ExtAgent) error { return errors.New("no instances found in Terraform output") } - sshc, err := extAgent.NewClient(t.output.Instances[0].PrivateIP) + sshc, err := extAgent.NewClient(t.output.Instances[0].PrivateIP, t.Config().AWSAMIUser) if err != nil { return err } @@ -978,7 +1035,7 @@ func (t *Terraform) updateAppConfig(siteURL string, sshc *ssh.Client, jobServerE cfg := &model.Config{} cfg.SetDefaults() cfg.ServiceSettings.ListenAddress = model.NewPointer(":8065") - cfg.ServiceSettings.LicenseFileLocation = model.NewPointer("/home/ubuntu/mattermost.mattermost-license") + cfg.ServiceSettings.LicenseFileLocation = model.NewPointer(fmt.Sprintf("/home/%s/mattermost.mattermost-license", t.config.AWSAMIUser)) cfg.ServiceSettings.SiteURL = model.NewPointer(siteURL) cfg.ServiceSettings.ReadTimeout = model.NewPointer(60) cfg.ServiceSettings.WriteTimeout = model.NewPointer(60) diff --git a/deployment/terraform/create_utils.go b/deployment/terraform/create_utils.go new file mode 100644 index 000000000..5434656d9 --- /dev/null +++ b/deployment/terraform/create_utils.go @@ -0,0 +1,37 @@ +package terraform + +import ( + "fmt" + "strings" + + "github.com/mattermost/mattermost-load-test-ng/deployment/terraform/ssh" + "github.com/mattermost/mattermost/server/public/shared/mlog" +) + +// setupPrometheusNodeExporter sets up prometheus-node-exporter on the given host. +// For now, this only set ups the service file, enables and starts he service. +func (t *Terraform) setupPrometheusNodeExporter(sshClient *ssh.Client) error { + mlog.Info("Setting up prometheus-node-exporter") + + serviceFile, err := fillConfigTemplate(prometheusNodeExporterServiceFile, nil) + if err != nil { + return fmt.Errorf("failed to fill prometheus-node-exporter service file template: %w", err) + } + + if out, err := sshClient.Upload(strings.NewReader(serviceFile), "/etc/systemd/system/prometheus-node-exporter.service", true); err != nil { + mlog.Error(string(out)) + return fmt.Errorf("failed to upload prometheus-node-exporter service file: %w", err) + } + + if out, err := sshClient.RunCommand("sudo systemctl daemon-reload"); err != nil { + mlog.Error(string(out)) + return fmt.Errorf("failed to reload systemd: %w", err) + } + + if out, err := sshClient.RunCommand("sudo systemctl enable --now prometheus-node-exporter"); err != nil { + mlog.Error(string(out)) + return fmt.Errorf("failed to enable prometheus-node-exporter service: %w", err) + } + + return nil +} diff --git a/deployment/terraform/dump.go b/deployment/terraform/dump.go index b9541dca4..8da8571b1 100644 --- a/deployment/terraform/dump.go +++ b/deployment/terraform/dump.go @@ -7,6 +7,7 @@ import ( "fmt" "path/filepath" "strings" + "sync" "github.com/mattermost/mattermost-load-test-ng/deployment" "github.com/mattermost/mattermost-load-test-ng/deployment/terraform/ssh" @@ -33,7 +34,7 @@ func (t *Terraform) ClearLicensesData() error { appClients := make([]*ssh.Client, len(output.Instances)) for i, instance := range output.Instances { - client, err := extAgent.NewClient(instance.PrivateIP) + client, err := extAgent.NewClient(instance.PrivateIP, t.Config().AWSAMIUser) if err != nil { return fmt.Errorf("error in getting ssh connection %w", err) } @@ -70,14 +71,8 @@ func (t *Terraform) ClearLicensesData() error { Clients: appClients, } - for _, c := range []deployment.Cmd{stopCmd, clearCmd, startCmd} { - mlog.Info(c.Msg) - for _, client := range c.Clients { - mlog.Debug("Running cmd", mlog.String("cmd", c.Value)) - if out, err := client.RunCommand(c.Value); err != nil { - return fmt.Errorf("failed to run cmd %q: %w %s", c.Value, err, out) - } - } + if err := t.executeCommands([]deployment.Cmd{stopCmd, clearCmd, startCmd}); err != nil { + return fmt.Errorf("error executing database commands: %w", err) } return nil @@ -103,7 +98,7 @@ func (t *Terraform) IngestDump() error { appClients := make([]*ssh.Client, len(output.Instances)) for i, instance := range output.Instances { - client, err := extAgent.NewClient(instance.PrivateIP) + client, err := extAgent.NewClient(instance.PrivateIP, t.Config().AWSAMIUser) if err != nil { return fmt.Errorf("error in getting ssh connection %w", err) } @@ -163,7 +158,7 @@ func (t *Terraform) ExecuteCustomSQL() error { return fmt.Errorf("no app instances deployed") } - client, err := extAgent.NewClient(output.Instances[0].PrivateIP) + client, err := extAgent.NewClient(output.Instances[0].PrivateIP, t.Config().AWSAMIUser) if err != nil { return fmt.Errorf("error in getting ssh connection %w", err) } @@ -224,7 +219,7 @@ func (t *Terraform) executeDatabaseCommands(extraCommands []deployment.Cmd) erro appClients := make([]*ssh.Client, len(output.Instances)) for i, instance := range output.Instances { - client, err := extAgent.NewClient(instance.PrivateIP) + client, err := extAgent.NewClient(instance.PrivateIP, t.Config().AWSAMIUser) if err != nil { return fmt.Errorf("error in getting ssh connection %w", err) } @@ -257,12 +252,36 @@ func (t *Terraform) executeDatabaseCommands(extraCommands []deployment.Cmd) erro func (t *Terraform) executeCommands(commands []deployment.Cmd) error { for _, c := range commands { mlog.Info(c.Msg) + + errors := make(chan error, len(c.Clients)) + wg := sync.WaitGroup{} + for _, client := range c.Clients { - mlog.Debug("Running cmd", mlog.String("cmd", c.Value)) - if out, err := client.RunCommand(c.Value); err != nil { - return fmt.Errorf("failed to run cmd %q: %w %s", c.Value, err, out) - } + wg.Add(1) + go func() { + defer wg.Done() + mlog.Debug("Running cmd", mlog.String("cmd", c.Value)) + if out, err := client.RunCommand(c.Value); err != nil { + errors <- fmt.Errorf("failed to run cmd %q: %w %s", c.Value, err, out) + } + }() } + + wg.Wait() + go func() { + close(errors) + }() + + errorsFound := false + for e := range errors { + errorsFound = true + mlog.Error(e.Error()) + } + + if errorsFound { + return fmt.Errorf("errors found during command execution") + } + } return nil diff --git a/deployment/terraform/keycloak.go b/deployment/terraform/keycloak.go index 75207dd45..ea1e06a9b 100644 --- a/deployment/terraform/keycloak.go +++ b/deployment/terraform/keycloak.go @@ -2,6 +2,7 @@ package terraform import ( "bufio" + "bytes" "errors" "fmt" "net/http" @@ -22,7 +23,7 @@ func (t *Terraform) setupKeycloak(extAgent *ssh.ExtAgent) error { keycloakDir := "/opt/keycloak/keycloak-" + t.config.ExternalAuthProviderSettings.KeycloakVersion keycloakBinPath := filepath.Join(keycloakDir, "bin") - mlog.Info("Configuring keycloak", mlog.String("host", t.output.KeycloakServer.PrivateIP)) + mlog.Info("Configuring keycloak server", mlog.String("host", t.output.KeycloakServer.PrivateIP)) extraArguments := []string{} command := "start" @@ -30,7 +31,7 @@ func (t *Terraform) setupKeycloak(extAgent *ssh.ExtAgent) error { command = "start-dev" } - sshc, err := extAgent.NewClient(t.output.KeycloakServer.PrivateIP) + sshc, err := extAgent.NewClient(t.output.KeycloakServer.PrivateIP, t.Config().AWSAMIUser) if err != nil { return fmt.Errorf("error in getting ssh connection %w", err) } @@ -45,20 +46,53 @@ func (t *Terraform) setupKeycloak(extAgent *ssh.ExtAgent) error { if strings.TrimSpace(string(result)) == "0" { mlog.Info("keycloak database not found, creating it and associated role") + // Get postgres home directory + output, err := sshc.RunCommand("sudo -iu postgres pwd") + if err != nil { + return fmt.Errorf("failed to get postgres home directory: %w", err) + } + postgresHome := bytes.TrimSpace(output) + + // Upload the pg_hba.conf file + postgresPgHba, err := fillConfigTemplate(keycloakDatabasePgHBAContents, nil) + if err != nil { + return fmt.Errorf("failed to execute keycloak service file template: %w", err) + } + + _, err = sshc.Upload(strings.NewReader(postgresPgHba), filepath.Join(string(postgresHome), "data/pg_hba.conf"), true) + if err != nil { + return fmt.Errorf("failed to upload keycloak service file: %w", err) + } + + // Set postgres:postgres ownership + _, err = sshc.RunCommand(fmt.Sprintf("sudo chown postgres:postgres %s/data/pg_hba.conf", string(postgresHome))) + if err != nil { + return fmt.Errorf("failed to change permissions on keycloak database pg_hba.conf file: %w", err) + } + + // Reload postgres to apply changes + _, err = sshc.RunCommand("sudo systemctl restart postgresql") + if err != nil { + return fmt.Errorf("failed to restart postgresql: %w", err) + } + + sqlRemoteFilePath := filepath.Join(strings.TrimSpace(string(postgresHome)), "/keycloak-database.sql") + // Upload and import keycloak initial SQL file`` - _, err := sshc.Upload(strings.NewReader(assets.MustAssetString("keycloak-database.sql")), "/var/lib/postgresql/keycloak-database.sql", true) + _, err = sshc.Upload(strings.NewReader(assets.MustAssetString("keycloak-database.sql")), sqlRemoteFilePath, true) if err != nil { return fmt.Errorf("failed to upload keycloak base database sql file: %w", err) } // Allow postgres user to read the file - _, err = sshc.RunCommand("sudo chown postgres:postgres /var/lib/postgresql/keycloak-database.sql") + _, err = sshc.RunCommand(fmt.Sprintf("sudo chown postgres:postgres %s", sqlRemoteFilePath)) if err != nil { return fmt.Errorf("failed to change permissions on keycloak database sql file: %w", err) } - _, err = sshc.RunCommand(`sudo -iu postgres psql -v ON_ERROR_STOP=on -f /var/lib/postgresql/keycloak-database.sql`) + out, err := sshc.RunCommand(fmt.Sprintf(`sudo -iu postgres psql -v ON_ERROR_STOP=on -f %s`, sqlRemoteFilePath)) if err != nil { + mlog.Error("Error running command", mlog.String("command", fmt.Sprintf(`sudo -iu postgres psql -v ON_ERROR_STOP=on -f %s`, sqlRemoteFilePath)), mlog.String("result", string(out)), mlog.Err(err)) return fmt.Errorf("failed to setup keycloak database: %w", err) } @@ -94,6 +128,14 @@ func (t *Terraform) setupKeycloak(extAgent *ssh.ExtAgent) error { } } + if t.output.HasMetrics() { + if err := t.setupPrometheusNodeExporter(sshc); err != nil { + return fmt.Errorf("error setting up prometheus node exporter: %w", err) + } + + extraArguments = append(extraArguments, "--metrics-enabled true") + } + keycloakEnvFileContents, err := fillConfigTemplate(keycloakEnvFileContents, map[string]any{ "KeycloakAdminUser": t.config.ExternalAuthProviderSettings.KeycloakAdminUser, "KeycloakAdminPassword": t.config.ExternalAuthProviderSettings.KeycloakAdminPassword, @@ -113,6 +155,7 @@ func (t *Terraform) setupKeycloak(extAgent *ssh.ExtAgent) error { keycloakServiceFileContents, err := fillConfigTemplate(keycloakServiceFileContents, map[string]any{ "KeycloakVersion": t.config.ExternalAuthProviderSettings.KeycloakVersion, "Command": command + " " + strings.Join(extraArguments, " "), + "User": t.Config().AWSAMIUser, }) if err != nil { return fmt.Errorf("failed to execute keycloak service file template: %w", err) @@ -297,7 +340,7 @@ func (t *Terraform) IngestKeycloakDump() error { return fmt.Errorf("no keycloak instances deployed") } - client, err := extAgent.NewClient(output.KeycloakServer.PrivateIP) + client, err := extAgent.NewClient(output.KeycloakServer.PrivateIP, t.Config().AWSAMIUser) if err != nil { return fmt.Errorf("error in getting ssh connection %w", err) } @@ -318,7 +361,7 @@ func (t *Terraform) IngestKeycloakDump() error { } commands := []string{ - "tar xzf /home/ubuntu/" + fileName + " -C /tmp", + fmt.Sprintf("tar xzf /home/%s/%s -C /tmp", t.Config().AWSAMIUser, fileName), "sudo -iu postgres psql -d keycloak -v ON_ERROR_STOP=on -f /tmp/" + strings.TrimSuffix(fileName, ".tgz"), } diff --git a/deployment/terraform/metrics.go b/deployment/terraform/metrics.go index 091c6054b..0f4fa752a 100644 --- a/deployment/terraform/metrics.go +++ b/deployment/terraform/metrics.go @@ -112,7 +112,7 @@ type DashboardData struct { func (t *Terraform) setupMetrics(extAgent *ssh.ExtAgent) error { // Updating Prometheus config - sshc, err := extAgent.NewClient(t.output.MetricsServer.PrivateIP) + sshc, err := extAgent.NewClient(t.output.MetricsServer.PrivateIP, t.Config().AWSAMIUser) if err != nil { return err } @@ -144,9 +144,21 @@ func (t *Terraform) setupMetrics(extAgent *ssh.ExtAgent) error { esEndpoint := fmt.Sprintf("https://%s", t.output.ElasticSearchServer.Endpoint) esTargets = append(esTargets, "metrics:9114") + serviceFileTmpl, err := template.New("es-exporter-service").Parse(esExporterServiceFile) + if err != nil { + return fmt.Errorf("error parsing elasticsearch exporter service file: %w", err) + } + + var serviceFileOutput bytes.Buffer + if err := serviceFileTmpl.Execute(&serviceFileOutput, map[string]string{ + "ESEndpoint": esEndpoint, + "User": t.Config().AWSAMIUser, + }); err != nil { + return fmt.Errorf("error executing elasticsearch exporter service file: %w", err) + } + mlog.Info("Enabling Elasticsearch exporter", mlog.String("host", t.output.MetricsServer.PrivateIP)) - esExporterService := fmt.Sprintf(esExporterServiceFile, esEndpoint) - rdr := strings.NewReader(esExporterService) + rdr := strings.NewReader(serviceFileOutput.String()) if out, err := sshc.Upload(rdr, "/lib/systemd/system/es-exporter.service", true); err != nil { return fmt.Errorf("error upload elasticsearch exporter service file: output: %s, error: %w", out, err) } @@ -156,7 +168,7 @@ func (t *Terraform) setupMetrics(extAgent *ssh.ExtAgent) error { } mlog.Info("Starting Elasticsearch exporter", mlog.String("host", t.output.MetricsServer.PrivateIP)) - cmd = "sudo service es-exporter restart" + cmd = "sudo systemctl restart es-exporter" if out, err := sshc.RunCommand(cmd); err != nil { return fmt.Errorf("error running ssh command: cmd: %s, output: %s, err: %v", cmd, out, err) } @@ -164,7 +176,11 @@ func (t *Terraform) setupMetrics(extAgent *ssh.ExtAgent) error { if t.output.HasKeycloak() { host := "keycloak" - keycloakTargets = append(keycloakTargets, fmt.Sprintf("%s:8080", host)) + keycloakTargets = append( + keycloakTargets, + fmt.Sprintf("%s:8080", host), // keycloak service + fmt.Sprintf("%s:9100", host), // node exporter + ) hosts += fmt.Sprintf("%s %s\n", t.output.KeycloakServer.PrivateIP, host) } @@ -174,10 +190,22 @@ func (t *Terraform) setupMetrics(extAgent *ssh.ExtAgent) error { mlog.Info("Enabling Redis exporter", mlog.String("host", t.output.MetricsServer.PrivateIP)) + serviceFileTmpl, err := template.New("es-exporter-service").Parse(esExporterServiceFile) + if err != nil { + return fmt.Errorf("error parsing elasticsearch exporter service file: %w", err) + } + + var serviceFileOutput bytes.Buffer + if err := serviceFileTmpl.Execute(&serviceFileOutput, map[string]string{ + "RedisAddr": redisEndpoint, + "User": t.Config().AWSAMIUser, + }); err != nil { + return fmt.Errorf("error executing elasticsearch exporter service file: %w", err) + } + // TODO: Pass username/pass later if we ever start using them internally. // It's possible to configure them on the server, but there is no need to set them up for internal load tests. - redisExporterService := fmt.Sprintf(redisExporterServiceFile, redisEndpoint) - rdr := strings.NewReader(redisExporterService) + rdr := strings.NewReader(serviceFileOutput.String()) if out, err := sshc.Upload(rdr, "/lib/systemd/system/redis-exporter.service", true); err != nil { return fmt.Errorf("error uploading redis exporter service file: output: %s, error: %w", out, err) } @@ -187,23 +215,28 @@ func (t *Terraform) setupMetrics(extAgent *ssh.ExtAgent) error { } mlog.Info("Starting Redis exporter", mlog.String("host", t.output.MetricsServer.PrivateIP)) - cmd = "sudo service redis-exporter restart" + cmd = "sudo systemctl restart redis-exporter" if out, err := sshc.RunCommand(cmd); err != nil { return fmt.Errorf("error running ssh command: cmd: %s, output: %s, err: %v", cmd, out, err) } } + if err := t.setupPrometheusNodeExporter(sshc); err != nil { + return fmt.Errorf("error setting up prometheus node exporter: %w", err) + } + yacePort := "9106" yaceDurationSeconds := "300" // Used for period, length, delay and scraping interval cloudwatchTargets = append(cloudwatchTargets, "metrics:"+yacePort) - mlog.Info("Updating YACE config", mlog.String("host", t.output.MetricsServer.PublicIP)) + mlog.Info("Updating YACE config", mlog.String("host", t.output.MetricsServer.PrivateIP)) yaceConfig, err := fillConfigTemplate(yaceConfigFile, map[string]any{ "ClusterName": t.output.ClusterName, "Period": yaceDurationSeconds, "Length": yaceDurationSeconds, "Delay": yaceDurationSeconds, + "AWSRegion": t.Config().AWSRegion, }) if err != nil { return fmt.Errorf("error rendering YACE configuration template: %w", err) @@ -216,6 +249,7 @@ func (t *Terraform) setupMetrics(extAgent *ssh.ExtAgent) error { yaceService, err := fillConfigTemplate(yaceServiceFile, map[string]any{ "ScrapingInterval": yaceDurationSeconds, "Port": yacePort, + "User": t.Config().AWSAMIUser, }) if err != nil { return fmt.Errorf("error rendering YACE service template: %w", err) @@ -229,8 +263,8 @@ func (t *Terraform) setupMetrics(extAgent *ssh.ExtAgent) error { return fmt.Errorf("error running ssh command: cmd: %s, output: %s, err: %v", cmd, out, err) } - mlog.Info("Starting Cloudwatch exporter: YACE", mlog.String("host", t.output.MetricsServer.PublicIP)) - cmd = "sudo service yace restart" + mlog.Info("Starting Cloudwatch exporter: YACE", mlog.String("host", t.output.MetricsServer.PrivateIP)) + cmd = "sudo systemctl restart yace" if out, err := sshc.RunCommand(cmd); err != nil { return fmt.Errorf("error running ssh command: cmd: %s, output: %s, err: %v", cmd, out, err) } @@ -249,7 +283,7 @@ func (t *Terraform) setupMetrics(extAgent *ssh.ExtAgent) error { strings.Join(quoteAll(mmTargets), ","), strings.Join(quoteAll(esTargets), ","), strings.Join(quoteAll(ltTargets), ","), - strings.Join(quoteAll(keycloakTargets), ""), + strings.Join(quoteAll(keycloakTargets), ","), strings.Join(quoteAll(redisTargets), ","), strings.Join(quoteAll(cloudwatchTargets), ","), strings.Join(quoteAll(netpeekTargets), ","), @@ -292,25 +326,19 @@ func (t *Terraform) setupMetrics(extAgent *ssh.ExtAgent) error { } mlog.Info("Starting Prometheus", mlog.String("host", t.output.MetricsServer.PrivateIP)) - cmd = "sudo service prometheus restart" - if out, err := sshc.RunCommand(cmd); err != nil { - return fmt.Errorf("error running ssh command: cmd: %s, output: %s, err: %v", cmd, out, err) - } - - mlog.Info("Starting Alloy", mlog.String("host", t.output.MetricsServer.PrivateIP)) - cmd = "sudo service alloy restart" + cmd = "sudo systemctl restart prometheus" if out, err := sshc.RunCommand(cmd); err != nil { return fmt.Errorf("error running ssh command: cmd: %s, output: %s, err: %v", cmd, out, err) } mlog.Info("Starting Alloy", mlog.String("host", t.output.MetricsServer.PrivateIP)) - cmd = "sudo service alloy restart" + cmd = "sudo systemctl restart alloy" if out, err := sshc.RunCommand(cmd); err != nil { return fmt.Errorf("error running ssh command: cmd: %s, output: %s, err: %v", cmd, out, err) } mlog.Info("Starting Pyroscope", mlog.String("host", t.output.MetricsServer.PrivateIP)) - cmd = "sudo service pyroscope restart" + cmd = "sudo systemctl restart pyroscope" if out, err := sshc.RunCommand(cmd); err != nil { return fmt.Errorf("error running ssh command: cmd: %s, output: %s, err: %v", cmd, out, err) } @@ -328,8 +356,7 @@ func (t *Terraform) setupMetrics(extAgent *ssh.ExtAgent) error { if err != nil { return err } - dataSource := fmt.Sprintf(string(buf), "http://"+t.output.MetricsServer.PrivateIP+":9090") - if out, err := sshc.Upload(strings.NewReader(dataSource), "/etc/grafana/provisioning/datasources/datasource.yaml", true); err != nil { + if out, err := sshc.Upload(bytes.NewReader(buf), "/etc/grafana/provisioning/datasources/datasource.yaml", true); err != nil { return fmt.Errorf("error while uploading datasource: output: %s, error: %w", out, err) } @@ -439,7 +466,7 @@ func (t *Terraform) setupMetrics(extAgent *ssh.ExtAgent) error { } // Restart grafana - cmd = "sudo service grafana-server restart" + cmd = "sudo systemctl restart grafana-server" if out, err := sshc.RunCommand(cmd); err != nil { return fmt.Errorf("error running ssh command: cmd: %s, output: %s, err: %v", cmd, out, err) } diff --git a/deployment/terraform/ssh/ssh.go b/deployment/terraform/ssh/ssh.go index e79079d28..212c3b68b 100644 --- a/deployment/terraform/ssh/ssh.go +++ b/deployment/terraform/ssh/ssh.go @@ -55,9 +55,9 @@ func NewAgent() (*ExtAgent, error) { // NewClientWithPort returns a Client object by dialing // the ssh agent on the provided port -func (ea *ExtAgent) NewClientWithPort(ip string, port string) (*Client, error) { +func (ea *ExtAgent) NewClientWithPort(ip, port, user string) (*Client, error) { config := &ssh.ClientConfig{ - User: "ubuntu", + User: user, Auth: []ssh.AuthMethod{ ssh.PublicKeysCallback(ea.agent.Signers), }, @@ -73,8 +73,8 @@ func (ea *ExtAgent) NewClientWithPort(ip string, port string) (*Client, error) { // NewClient returns a Client object by dialing // the ssh agent on port 22 -func (ea *ExtAgent) NewClient(ip string) (*Client, error) { - return ea.NewClientWithPort(ip, ":22") +func (ea *ExtAgent) NewClient(ip, user string) (*Client, error) { + return ea.NewClientWithPort(ip, ":22", user) } // RunCommand runs a given command in a new ssh session. @@ -116,7 +116,7 @@ func (sshc *Client) Upload(src io.Reader, dst string, sudo bool) ([]byte, error) defer sess.Close() sess.Stdin = src - cmd := fmt.Sprintf("cat > '%s'", dst) + cmd := fmt.Sprintf(`cat > "%s"`, dst) if sudo { cmd = fmt.Sprintf("sudo su -c %q", cmd) } diff --git a/deployment/terraform/strings.go b/deployment/terraform/strings.go index 4d1c728e6..ec6845997 100644 --- a/deployment/terraform/strings.go +++ b/deployment/terraform/strings.go @@ -16,12 +16,12 @@ ExecStart=/opt/mattermost/bin/mattermost Restart=always RestartSec=10 WorkingDirectory=/opt/mattermost -User=ubuntu -Group=ubuntu +User={{.User}} +Group={{.User}} LimitNOFILE=49152 Environment=MM_FEATUREFLAGS_POSTPRIORITY=true Environment=MM_FEATUREFLAGS_WEBSOCKETEVENTSCOPE=true -Environment=MM_SERVICEENVIRONMENT=%s +Environment=MM_SERVICEENVIRONMENT={{.ServiceEnvironment}} [Install] WantedBy=multi-user.target @@ -64,6 +64,19 @@ scrape_configs: - targets: [%s] ` +const prometheusServiceFile = `` + +const prometheusNodeExporterServiceFile = `[Unit] +Description=Node Exporter + +[Service] +# Fallback when environment file does not exist +EnvironmentFile=-/etc/default/prometheus-node-exporter +ExecStart=/usr/local/bin/node_exporter + +[Install] +WantedBy=multi-user.target` + const metricsHosts = ` 127.0.0.1 localhost @@ -94,7 +107,7 @@ ff02::3 ip6-allhosts ` const nginxConfigTmpl = ` -user www-data; +#user www-data; worker_processes auto; worker_rlimit_nofile 100000; pid /run/nginx.pid; @@ -284,7 +297,7 @@ net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 ` -const baseAPIServerCmd = `/home/ubuntu/mattermost-load-test-ng/bin/ltapi` +const baseAPIServerCmd = `/home/%s/mattermost-load-test-ng/bin/ltapi` const apiServiceFile = ` [Unit] @@ -298,9 +311,9 @@ Environment="BLOCK_PROFILE_RATE={{ printf "%d" .blockProfileRate}}" ExecStart={{ printf "%s" .execStart}} Restart=always RestartSec=1 -WorkingDirectory=/home/ubuntu/mattermost-load-test-ng -User=ubuntu -Group=ubuntu +WorkingDirectory=/home/{{.User}}/mattermost-load-test-ng +User={{.User}} +Group={{.User}} LimitNOFILE=262144 [Install] @@ -314,12 +327,12 @@ After=network.target [Service] Type=simple -ExecStart=/opt/elasticsearch_exporter/elasticsearch_exporter --es.uri="%s" +ExecStart=/opt/elasticsearch_exporter/elasticsearch_exporter --es.uri="{{.ESEndpoint}}" Restart=always RestartSec=10 WorkingDirectory=/opt/elasticsearch_exporter -User=ubuntu -Group=ubuntu +User={{.User}} +Group={{.User}} [Install] WantedBy=multi-user.target @@ -332,12 +345,12 @@ After=network.target [Service] Type=simple -ExecStart=/opt/redis_exporter/redis_exporter --redis.addr="%s" +ExecStart=/opt/redis_exporter/redis_exporter --redis.addr="{{.RedisAddr}}" Restart=always RestartSec=10 WorkingDirectory=/opt/redis_exporter -User=ubuntu -Group=ubuntu +User={{.User}} +Group={{.User}} [Install] WantedBy=multi-user.target @@ -359,7 +372,7 @@ discovery: jobs: - type: AWS/RDS regions: - - us-east-1 + - {{.AWSRegion}} period: {{.Period}} length: {{.Length}} delay: {{.Delay}} @@ -390,7 +403,7 @@ discovery: statistics: [Average] - type: AWS/ES regions: - - us-east-1 + - {{.AWSRegion}} period: {{.Period}} length: {{.Length}} delay: {{.Delay}} @@ -431,7 +444,7 @@ discovery: statistics: [Maximum] - type: AWS/EC2 regions: - - us-east-1 + - {{.AWSRegion}} period: {{.Period}} length: {{.Length}} delay: {{.Delay}} @@ -460,8 +473,8 @@ ExecStart=/opt/yace/yace -listen-address :{{.Port}} -config.file /opt/yace/conf. Restart=always RestartSec=10 WorkingDirectory=/opt/yace -User=ubuntu -Group=ubuntu +User={{.User}} +Group={{.User}} [Install] WantedBy=multi-user.target @@ -478,8 +491,8 @@ ExecStart=/opt/mattermost/bin/mattermost jobserver Restart=always RestartSec=10 WorkingDirectory=/opt/mattermost -User=ubuntu -Group=ubuntu +User={{User}} +Group={{.User}} LimitNOFILE=49152 Environment=MM_SERVICEENVIRONMENT=%s @@ -505,8 +518,8 @@ Description=Keycloak After=network.target [Service] -User=ubuntu -Group=ubuntu +User={{.User}} +Group={{.User}} EnvironmentFile=/etc/systemd/system/keycloak.env ExecStart=/opt/keycloak/keycloak-{{ .KeycloakVersion }}/bin/kc.sh {{ .Command }} @@ -524,11 +537,27 @@ KC_DB_POOL_MIN_SIZE=20 KC_DB_POOL_INITIAL_SIZE=20 KC_DB_POOL_MAX_SIZE=200 KC_DB=postgres -KC_DB_URL=jdbc:psql://localhost:5433/keycloak -KC_DB_PASSWORD=mmpass +KC_DB_URL=jdbc:psql://keycloak:mmpass@localhost:5432/keycloak KC_DB_USERNAME=keycloak +KC_DB_PASSWORD=mmpass KC_DATABASE=keycloak` +const keycloakDatabasePgHBAContents = ` +# TYPE DATABASE USER ADDRESS METHOD +host keycloak keycloak 127.0.0.1/32 md5 +# "local" is for Unix domain socket connections only +local all all peer +# IPv4 local connections: +# host all all 127.0.0.1/32 ident +# IPv6 local connections: +# host all all ::1/128 ident +# Allow replication connections from localhost, by a user with the +# replication privilege. +local replication all peer +host replication all 127.0.0.1/32 ident +host replication all ::1/128 ident +` + const prometheusNodeExporterConfig = ` ARGS="--collector.ethtool" ` @@ -616,7 +645,7 @@ type otelcolReceiver struct { func renderAgentOtelcolConfig(instanceName string, metricsIP string) (string, error) { agentReceiver := otelcolReceiver{ Name: "filelog/agent", - IncludeFiles: "/home/ubuntu/mattermost-load-test-ng/ltagent.log", + IncludeFiles: "/home/{{.User}}/mattermost-load-test-ng/ltagent.log", ServiceName: "agent", ServiceInstanceId: instanceName, Operator: otelcolOperatorAppAgent, @@ -624,7 +653,7 @@ func renderAgentOtelcolConfig(instanceName string, metricsIP string) (string, er coordinatorReceiver := otelcolReceiver{ Name: "filelog/coordinator", - IncludeFiles: "/home/ubuntu/mattermost-load-test-ng/ltcoordinator.log", + IncludeFiles: "/home/{{.User}}/mattermost-load-test-ng/ltcoordinator.log", ServiceName: "coordinator", ServiceInstanceId: instanceName, Operator: otelcolOperatorAppAgent, diff --git a/deployment/terraform/utils.go b/deployment/terraform/utils.go index 95f0295e7..d743287eb 100644 --- a/deployment/terraform/utils.go +++ b/deployment/terraform/utils.go @@ -98,40 +98,40 @@ func (t *Terraform) makeCmdForResource(resource string) (*exec.Cmd, error) { // first agent. for i, agent := range output.Agents { if resource == agent.Tags.Name || (i == 0 && resource == "coordinator") { - return exec.Command("ssh", fmt.Sprintf("ubuntu@%s", agent.PrivateIP)), nil + return exec.Command("ssh", fmt.Sprintf("%s@%s", t.Config().AWSAMIUser, agent.PrivateIP)), nil } } // Match against the instance names. for _, instance := range output.Instances { if resource == instance.Tags.Name { - return exec.Command("ssh", fmt.Sprintf("ubuntu@%s", instance.PrivateIP)), nil + return exec.Command("ssh", fmt.Sprintf("%s@%s", t.Config().AWSAMIUser, instance.PrivateIP)), nil } } // Match against the job server names. for _, instance := range output.JobServers { if resource == instance.Tags.Name { - return exec.Command("ssh", fmt.Sprintf("ubuntu@%s", instance.PrivateIP)), nil + return exec.Command("ssh", fmt.Sprintf("%s@%s", t.Config().AWSAMIUser, instance.PrivateIP)), nil } } // Match against proxy names for _, inst := range output.Proxies { if resource == inst.Tags.Name { - return exec.Command("ssh", fmt.Sprintf("ubuntu@%s", inst.PublicIP)), nil + return exec.Command("ssh", fmt.Sprintf("ubuntu@%s", inst.PrivateIP)), nil } } // Match against the metrics servers, as well as convenient aliases. if output.KeycloakServer.Tags.Name == resource { - return exec.Command("ssh", fmt.Sprintf("ubuntu@%s", output.KeycloakServer.PrivateIP)), nil + return exec.Command("ssh", fmt.Sprintf("%s@%s", t.Config().AWSAMIUser, output.KeycloakServer.PrivateIP)), nil } // Match against the proxy or metrics servers, as well as convenient aliases. switch resource { case "metrics", "prometheus", "grafana", output.MetricsServer.Tags.Name: - return exec.Command("ssh", fmt.Sprintf("ubuntu@%s", output.MetricsServer.PrivateIP)), nil + return exec.Command("ssh", fmt.Sprintf("%s@%s", t.Config().AWSAMIUser, output.MetricsServer.PrivateIP)), nil } return nil, fmt.Errorf("could not find any resource with name %q", resource) @@ -251,6 +251,7 @@ func (t *Terraform) getParams() []string { "-var", fmt.Sprintf("aws_region=%s", t.config.AWSRegion), "-var", fmt.Sprintf("aws_az=%s", t.config.AWSAvailabilityZone), "-var", fmt.Sprintf("aws_ami=%s", t.config.AWSAMI), + "-var", fmt.Sprintf("aws_ami_user=%s", t.config.AWSAMIUser), "-var", fmt.Sprintf("cluster_name=%s", t.config.ClusterName), "-var", fmt.Sprintf("cluster_vpc_id=%s", t.config.ClusterVpcID), "-var", fmt.Sprintf(`cluster_subnet_ids=%s`, t.config.ClusterSubnetIDs), @@ -352,7 +353,7 @@ func (t *Terraform) GetAWSConfig() (aws.Config, error) { } profile := awsconfig.WithSharedConfigProfile(t.config.AWSProfile) - return awsconfig.LoadDefaultConfig(context.Background(), profile) + return awsconfig.LoadDefaultConfig(context.Background(), profile, awsconfig.WithRegion(t.config.AWSRegion)) } // GetAWSCreds returns the AWS config, using the profile configured in the diff --git a/deployment/utils.go b/deployment/utils.go index 7c403e25e..c08b2bd67 100644 --- a/deployment/utils.go +++ b/deployment/utils.go @@ -40,7 +40,7 @@ func ProvisionURL(client *ssh.Client, url, filename string) error { if !info.Mode().IsRegular() { return fmt.Errorf("build file %s has to be a regular file", path) } - if out, err := client.UploadFile(path, "/home/ubuntu/"+filename, false); err != nil { + if out, err := client.UploadFile(path, fmt.Sprintf("$HOME/%s", filename), false); err != nil { return fmt.Errorf("error uploading build: %w %s", err, out) } } else { diff --git a/loadtest/control/simulcontroller/actions.go b/loadtest/control/simulcontroller/actions.go index 19056559a..2c845b258 100644 --- a/loadtest/control/simulcontroller/actions.go +++ b/loadtest/control/simulcontroller/actions.go @@ -148,6 +148,7 @@ func (c *SimulController) login(u user.User) control.UserActionResponse { return resp } c.status <- c.newErrorStatus(err) + return control.UserActionResponse{Err: err} } appErr, ok := resp.Err.(*control.UserError).Err.(*model.AppError) diff --git a/loadtest/loadtest.go b/loadtest/loadtest.go index 0025045ee..a1cdba27b 100644 --- a/loadtest/loadtest.go +++ b/loadtest/loadtest.go @@ -14,6 +14,7 @@ import ( "github.com/mattermost/mattermost-load-test-ng/defaults" "github.com/mattermost/mattermost-load-test-ng/loadtest/control" + "github.com/mattermost/mattermost-load-test-ng/logger" "github.com/wiggin77/merror" "github.com/mattermost/mattermost/server/public/shared/mlog" @@ -128,6 +129,7 @@ func (lt *LoadTester) addUser() error { lt.wg.Add(1) go func() { + logger.Init(<.config.LogSettings) controller.Run() }() return nil diff --git a/loadtest/user/userentity/actions.go b/loadtest/user/userentity/actions.go index ead4b9614..fa9646c31 100644 --- a/loadtest/user/userentity/actions.go +++ b/loadtest/user/userentity/actions.go @@ -19,6 +19,7 @@ import ( "github.com/graph-gophers/graphql-go" "github.com/mattermost/mattermost-load-test-ng/loadtest/user" "github.com/mattermost/mattermost/server/public/model" + "github.com/mattermost/mattermost/server/public/shared/mlog" ) // Possible actions for the IDP authentication @@ -47,9 +48,11 @@ func (ue *UserEntity) SignUp(email, username, password string) error { return fmt.Errorf("error while signing up using %s: %w", ue.config.AuthenticationType, err) } - newUser, _, err = ue.client.GetUserByUsername(context.Background(), username, "") + newUser, _, err = ue.client.GetUserByEmail(context.Background(), email, "") + // newUser, _, err = ue.client.GetUserByUsername(context.Background(), username, "") if err != nil { - return fmt.Errorf("error while getting user by username: %w", err) + // return fmt.Errorf("error while getting user by username: %w", err) + return fmt.Errorf("error while getting user by email: %w", err) } default: @@ -121,6 +124,18 @@ func (ue *UserEntity) authIDP(action authIDPAction, provider string) error { } if loginResponse.StatusCode != http.StatusOK { + samlResponseBody, err := io.ReadAll(loginResponse.Body) + if err != nil { + return fmt.Errorf("error while reading saml response body: %w", err) + } + loginResponse.Body.Close() + + mlog.Debug( + "Login response", + mlog.String("body", string(samlResponseBody)), + mlog.Int("status", loginResponse.StatusCode), + ) + return fmt.Errorf("%s failed with status code %d", action, loginResponse.StatusCode) } @@ -153,9 +168,17 @@ func (ue *UserEntity) authIDP(action authIDPAction, provider string) error { queryParams.Add(string(matches[1]), string(matches[2])) } + mlog.Debug( + "SAML form info", + mlog.String("formURL", formURL), + mlog.String("redirectURLMatcher_0", string(redirectURLMatcher[0])), + mlog.String("redirectURLMatcher_1", string(redirectURLMatcher[1])), + mlog.String("samlResponseBody", string(samlResponseBody)), + ) + samlForm, err := client.PostForm(formURL, queryParams) if err != nil { - return fmt.Errorf("error while posting SAML form: %w", err) + return fmt.Errorf("error while posting SAML form using client URL %s: %w", ue.client.URL, err) } samlForm.Body.Close() if samlForm.StatusCode != http.StatusOK { @@ -194,9 +217,11 @@ func (ue *UserEntity) Login() error { return fmt.Errorf("error while logging in using %s: %w", ue.config.AuthenticationType, err) } - loggedUser, _, err = ue.client.GetUserByUsername(context.Background(), user.Username, "") + loggedUser, _, err = ue.client.GetUserByEmail(context.Background(), user.Email, "") + // loggedUser, _, err = ue.client.GetUserByUsername(context.Background(), user.Username, "") if err != nil { - return fmt.Errorf("error while getting user by username through %s: %w", ue.config.AuthenticationType, err) + // return fmt.Errorf("error while getting user by username through %s: %w", ue.config.AuthenticationType, err) + return fmt.Errorf("error while getting user by email through %s: %w", ue.config.AuthenticationType, err) } default: loggedUser, _, err = ue.client.Login(context.Background(), user.Email, user.Password)