func ShortenImageURL(defaultProject string, imageURL string) (string, error) { u, err := gce.ParseGoogleCloudURL(imageURL) if err != nil { return "", err } if u.Project == defaultProject { return u.Name, nil } else { return u.Project + "/" + u.Name, nil } }
func (e *Instance) Find(c *fi.Context) (*Instance, error) { cloud := c.Cloud.(*gce.GCECloud) r, err := cloud.Compute.Instances.Get(cloud.Project, *e.Zone, *e.Name).Do() if err != nil { if gce.IsNotFound(err) { return nil, nil } return nil, fmt.Errorf("error listing Instances: %v", err) } actual := &Instance{} actual.Name = &r.Name for _, tag := range r.Tags.Items { actual.Tags = append(actual.Tags, tag) } actual.Zone = fi.String(lastComponent(r.Zone)) actual.MachineType = fi.String(lastComponent(r.MachineType)) actual.CanIPForward = &r.CanIpForward if r.Scheduling != nil { actual.Preemptible = &r.Scheduling.Preemptible } if len(r.NetworkInterfaces) != 0 { ni := r.NetworkInterfaces[0] actual.Network = &Network{Name: fi.String(lastComponent(ni.Network))} if len(ni.AccessConfigs) != 0 { ac := ni.AccessConfigs[0] if ac.NatIP != "" { addr, err := cloud.Compute.Addresses.List(cloud.Project, cloud.Region).Filter("address eq " + ac.NatIP).Do() if err != nil { return nil, fmt.Errorf("error querying for address %q: %v", ac.NatIP, err) } else if len(addr.Items) != 0 { actual.IPAddress = &IPAddress{Name: &addr.Items[0].Name} } else { return nil, fmt.Errorf("address not found %q: %v", ac.NatIP, err) } } } } for _, serviceAccount := range r.ServiceAccounts { for _, scope := range serviceAccount.Scopes { actual.Scopes = append(actual.Scopes, scopeToShortForm(scope)) } } actual.Disks = make(map[string]*PersistentDisk) for i, disk := range r.Disks { if i == 0 { source := disk.Source // TODO: Parse source URL instead of assuming same project/zone? name := lastComponent(source) d, err := cloud.Compute.Disks.Get(cloud.Project, *e.Zone, name).Do() if err != nil { if gce.IsNotFound(err) { return nil, fmt.Errorf("disk not found %q: %v", source, err) } return nil, fmt.Errorf("error querying for disk %q: %v", source, err) } image, err := ShortenImageURL(cloud.Project, d.SourceImage) if err != nil { return nil, fmt.Errorf("error parsing source image URL: %v", err) } actual.Image = fi.String(image) } else { url, err := gce.ParseGoogleCloudURL(disk.Source) if err != nil { return nil, fmt.Errorf("unable to parse disk source URL: %q", disk.Source) } actual.Disks[disk.DeviceName] = &PersistentDisk{Name: &url.Name} } } if r.Metadata != nil { actual.Metadata = make(map[string]fi.Resource) for _, i := range r.Metadata.Items { if i.Value == nil { glog.Warningf("ignoring GCE instance metadata entry with nil-value: %q", i.Key) continue } actual.Metadata[i.Key] = fi.NewStringResource(*i.Value) } actual.metadataFingerprint = r.Metadata.Fingerprint } return actual, nil }