func (l *Loader) resourceHandler(i *loader.TreeWalkItem) error { contents, err := i.ReadBytes() if err != nil { return err } var a fi.Resource key := i.RelativePath if strings.HasSuffix(key, ".template") { key = strings.TrimSuffix(key, ".template") glog.V(2).Infof("loading (templated) resource %q", key) a = &templateResource{ template: string(contents), loader: l, key: key, } } else { glog.V(2).Infof("loading resource %q", key) a = fi.NewBytesResource(contents) } l.Resources[key] = a return nil }
func (e *Instance) Find(c *fi.Context) (*Instance, error) { cloud := c.Cloud.(*awsup.AWSCloud) filters := cloud.BuildFilters(e.Name) filters = append(filters, awsup.NewEC2Filter("instance-state-name", "pending", "running", "stopping", "stopped")) request := &ec2.DescribeInstancesInput{ Filters: filters, } response, err := cloud.EC2.DescribeInstances(request) if err != nil { return nil, fmt.Errorf("error listing instances: %v", err) } instances := []*ec2.Instance{} if response != nil { for _, reservation := range response.Reservations { for _, instance := range reservation.Instances { instances = append(instances, instance) } } } if len(instances) == 0 { return nil, nil } if len(instances) != 1 { return nil, fmt.Errorf("found multiple Instances with name: %s", *e.Name) } glog.V(2).Info("found existing instance") i := instances[0] if i.InstanceId == nil { return nil, fmt.Errorf("found instance, but InstanceId was nil") } actual := &Instance{ ID: i.InstanceId, PrivateIPAddress: i.PrivateIpAddress, InstanceType: i.InstanceType, ImageID: i.ImageId, Name: findNameTag(i.Tags), } // Fetch instance UserData { request := &ec2.DescribeInstanceAttributeInput{} request.InstanceId = i.InstanceId request.Attribute = aws.String("userData") response, err := cloud.EC2.DescribeInstanceAttribute(request) if err != nil { return nil, fmt.Errorf("error querying EC2 for user metadata for instance %q: %v", *i.InstanceId) } if response.UserData != nil { b, err := base64.StdEncoding.DecodeString(aws.StringValue(response.UserData.Value)) if err != nil { return nil, fmt.Errorf("error decoding EC2 UserData: %v", err) } actual.UserData = fi.NewBytesResource(b) } } if i.SubnetId != nil { actual.Subnet = &Subnet{ID: i.SubnetId} } if i.KeyName != nil { actual.SSHKey = &SSHKey{Name: i.KeyName} } for _, sg := range i.SecurityGroups { actual.SecurityGroups = append(actual.SecurityGroups, &SecurityGroup{ID: sg.GroupId}) } associatePublicIpAddress := false for _, ni := range i.NetworkInterfaces { if aws.StringValue(ni.Association.PublicIp) != "" { associatePublicIpAddress = true } } actual.AssociatePublicIP = &associatePublicIpAddress if i.IamInstanceProfile != nil { actual.IAMInstanceProfile = &IAMInstanceProfile{Name: nameFromIAMARN(i.IamInstanceProfile.Arn)} } actual.Tags = mapEC2TagsToMap(i.Tags) e.ID = actual.ID // Avoid spurious changes on ImageId if e.ImageID != nil && actual.ImageID != nil && *actual.ImageID != *e.ImageID { image, err := cloud.ResolveImage(*e.ImageID) if err != nil { glog.Warningf("unable to resolve image: %q: %v", *e.ImageID, err) } else if image == nil { glog.Warningf("unable to resolve image: %q: not found", *e.ImageID) } else if aws.StringValue(image.ImageId) == *actual.ImageID { glog.V(4).Infof("Returning matching ImageId as expected name: %q -> %q", *actual.ImageID, *e.ImageID) actual.ImageID = e.ImageID } } return actual, nil }