// VPCStateRefreshFunc returns a resource.StateRefreshFunc that is used to watch // a VPC. func VPCStateRefreshFunc(conn *ec2.EC2, id string) resource.StateRefreshFunc { return func() (interface{}, string, error) { DescribeVpcOpts := &ec2.DescribeVPCsInput{ VPCIDs: []*string{aws.String(id)}, } resp, err := conn.DescribeVPCs(DescribeVpcOpts) if err != nil { if ec2err, ok := err.(awserr.Error); ok && ec2err.Code() == "InvalidVpcID.NotFound" { resp = nil } else { log.Printf("Error on VPCStateRefresh: %s", err) return nil, "", err } } if resp == nil { // Sometimes AWS just has consistency issues and doesn't see // our instance yet. Return an empty state. return nil, "", nil } vpc := resp.VPCs[0] return vpc, *vpc.State, nil } }
// Get all of the VPCs configured in the environment func getAllVPCs(ec2client *ec2.EC2) ([]*ec2.VPC, error) { //Get all of the VPCs vpcs, err := ec2client.DescribeVPCs(&ec2.DescribeVPCsInput{}) //If we had an error, return it if err != nil { return []*ec2.VPC{}, err } //Otherwise, return all of our VPCs return vpcs.VPCs, nil }
/* validateVPC will query ec2 and see if the VPC exists. If it does not exist, then if createIfNotFound is true, it will attempt to create it */ func validateVPC(ec2Client *ec2.EC2, providerConfig *providers.JSONObject, createIfNotFound bool) (success bool, warnings []string, err []error) { vpcName := providerConfig.Provider.ProviderConfig.Aws.Vpc.Name log.WithFields(log.Fields{ "VPC Name": vpcName, }).Info("Validating if VPC exists") //See if VPC exists filters := []*ec2.Filter{newEc2Filter("tag:"+nameTag, vpcName)} params := &ec2.DescribeVPCsInput{Filters: filters} vpcQueryOutput, callErr := ec2Client.DescribeVPCs(params) if err != nil { err = append(err, callErr) log.WithFields(log.Fields{ "AWS Error": err, }).Error("Error Querying VPC") } else { if len(vpcQueryOutput.VPCs) > 0 { //Found VPC log.WithFields(log.Fields{ "VpcID": providerConfig.Provider.ProviderConfig.Aws.Vpc.VpcID, }).Info("VPC Found") providerConfig.Provider.ProviderConfig.Aws.Vpc.VpcID = *vpcQueryOutput.VPCs[0].VPCID success = true } else { if createIfNotFound { //create new VPC createSuccess, createWarning, createError := addVPC(ec2Client, providerConfig) if createSuccess { success = true for w := range createWarning { warnings = append(warnings, createWarning[w]) } } else { success = false for e := range createError { err = append(err, createError[e]) } } } else { //VPC not found and createIfNotFound is false err = append(err, errors.New("VPC does not exist and create if not found is false")) success = false } } } return success, warnings, err }
func findVPCsByDHCPOptionsID(conn *ec2.EC2, id string) ([]*ec2.VPC, error) { req := &ec2.DescribeVPCsInput{ Filters: []*ec2.Filter{ &ec2.Filter{ Name: aws.String("dhcp-options-id"), Values: []*string{ aws.String(id), }, }, }, } resp, err := conn.DescribeVPCs(req) if err != nil { if ec2err, ok := err.(awserr.Error); ok && ec2err.Code() == "InvalidVpcID.NotFound" { return nil, nil } return nil, err } return resp.VPCs, nil }