Beispiel #1
0
func createCluster(context *cli.Context, rdwr config.ReadWriter, ecsClient ecsclient.ECSClient, cfnClient cloudformation.CloudformationClient, amiIds ami.ECSAmiIds) error {
	// Validate cli flags
	if !isIAMAcknowledged(context) {
		return fmt.Errorf("Please acknowledge that this command may create IAM resources with the '--%s' flag", capabilityIAMFlag)
	}
	ecsParams, err := config.NewCliParams(context, rdwr)
	if err != nil {
		return err
	}

	// Check if cfn stack already exists
	cfnClient.Initialize(ecsParams)
	stackName := ecsParams.GetCfnStackName()
	if err := cfnClient.ValidateStackExists(stackName); err == nil {
		return fmt.Errorf("A CloudFormation stack already exists for the cluster '%s'", ecsParams.Cluster)
	}

	// Populate cfn params
	cfnParams := cliFlagsToCfnStackParams(context)
	cfnParams.Add(cloudformation.ParameterKeyCluster, ecsParams.Cluster)

	// Check if key pair exists
	_, err = cfnParams.GetParameter(cloudformation.ParameterKeyKeyPairName)
	if err == cloudformation.ParameterNotFoundError {
		return fmt.Errorf("Please specify the keypair name with '--%s' flag", keypairNameFlag)
	} else if err != nil {
		return err
	}

	// Check if image id was supplied, else populate
	_, err = cfnParams.GetParameter(cloudformation.ParameterKeyAmiId)
	if err == cloudformation.ParameterNotFoundError {
		amiId, err := amiIds.Get(aws.StringValue(ecsParams.Config.Region))
		if err != nil {
			return err
		}
		cfnParams.Add(cloudformation.ParameterKeyAmiId, amiId)
	} else if err != nil {
		return err
	}
	if err := cfnParams.Validate(); err != nil {
		return err
	}

	// Create ECS cluster
	ecsClient.Initialize(ecsParams)
	if _, err := ecsClient.CreateCluster(ecsParams.Cluster); err != nil {
		return err
	}

	// Create cfn stack
	template := cloudformation.GetTemplate()
	if _, err := cfnClient.CreateStack(template, stackName, cfnParams); err != nil {
		return err
	}

	logrus.Info("Waiting for your cluster resources to be created")
	// Wait for stack creation
	return cfnClient.WaitUntilCreateComplete(stackName)
}
// populateContext sets the required CLI arguments to the context
func (projectFactory projectFactory) populateContext(ecsContext *ecscompose.Context, cliContext *cli.Context) error {
	// populate CLI context
	populate(ecsContext, cliContext)
	ecsContext.CLIContext = cliContext

	// reads and sets the parameters (required to create ECS Service Client) from the cli context to ecs context
	rdwr, err := config.NewReadWriter()
	if err != nil {
		utils.LogError(err, "Error loading config")
		return err
	}
	params, err := config.NewCliParams(cliContext, rdwr)
	if err != nil {
		utils.LogError(err, "Unable to create an instance of ECSParams given the cli context")
		return err
	}
	ecsContext.ECSParams = params

	// populate libcompose context
	if err = projectFactory.populateLibcomposeContext(ecsContext); err != nil {
		return err
	}

	return nil
}
func TestNewECSClientWithRegion(t *testing.T) {
	// TODO: Re-enable by making an integ test target in Makefile.
	t.Skip("Integ test, Re-enable Me!")
	globalSet := flag.NewFlagSet("ecs-cli", 0)
	globalContext := cli.NewContext(nil, globalSet, nil)
	context := cli.NewContext(nil, nil, globalContext)
	rdwr := &mockReadWriter{}
	_, err := config.NewCliParams(context, rdwr)
	if err == nil {
		t.Errorf("Expected error when region not specified")
	}

	globalSet.String("region", "us-east-1", "")
	globalContext = cli.NewContext(nil, globalSet, nil)
	context = cli.NewContext(nil, nil, globalContext)
	params, err := config.NewCliParams(context, rdwr)
	if err != nil {
		t.Errorf("Unexpected error creating opts: ", err)
	}
	client := NewECSClient()
	client.Initialize(params)

	// test for UserAgent
	realClient, ok := client.(*ecsClient).client.(*ecs.ECS)
	if !ok {
		t.Fatal("Could not cast client to ecs.ECS")
	}
	buildHandlerList := realClient.Handlers.Build
	request := &request.Request{
		HTTPRequest: &http.Request{
			Header: http.Header{},
		},
	}
	buildHandlerList.Run(request)
	expectedUserAgentString := fmt.Sprintf("%s %s %s/%s",
		version.AppName, version.Version, aws.SDKName, aws.SDKVersion)
	userAgent := request.HTTPRequest.Header.Get(clients.UserAgentHeader)
	if userAgent != expectedUserAgentString {
		t.Errorf("Wrong User-Agent string, expected \"%s\" but was \"%s\"",
			expectedUserAgentString, userAgent)
	}
}
		}
	}

	// Create cfn stack
	template := cloudformation.GetTemplate()
	if _, err := cfnClient.CreateStack(template, stackName, cfnParams); err != nil {
		return err
	}

	logrus.Info("Waiting for your cluster resources to be created...")
	// Wait for stack creation
	return cfnClient.WaitUntilCreateComplete(stackName)
}

var newCliParams = func(context *cli.Context, rdwr config.ReadWriter) (*config.CliParams, error) {
	return config.NewCliParams(context, rdwr)
}

func deleteCluster(context *cli.Context, rdwr config.ReadWriter, ecsClient ecsclient.ECSClient, cfnClient cloudformation.CloudformationClient) error {
	// Validate cli flags
	if !isForceSet(context) {
		return fmt.Errorf("Missing required flag '--%s'", forceFlag)
		// TODO prompt override for force
	}
	ecsParams, err := newCliParams(context, rdwr)
	if err != nil {
		return err
	}

	// Validate that cluster exists in ECS
	ecsClient.Initialize(ecsParams)