> + checkNotNull(from, "Null image"); > + > + String desc = from.name(); > + OsFamily osFamily = parseOsFamily(desc); > + > + OperatingSystem os = OperatingSystem.builder() > + .description(osFamily.value()) > + .family(osFamily) > + .version(parseVersion(desc)) > + .is64Bit(is64Bit(desc)) > + .build(); > + > + return new ImageBuilder() > + .ids(from.id()) > + .name(desc) > + .location(mapLocation(from.location()))
The location hierarchy makes sense. jclouds, however, already provides the PROVIDER location through the `JustProvider` supplier. You can inject it in the DataCenterToLocation function and use it. Have a look at how [digitalocean](https://github.com/jclouds/jclouds-labs/blob/master/digitalocean/src/main/java/org/jclouds/digitalocean/compute/functions/RegionToLocation.java) does this. Regarding the images that don't exist in all locations: * The ComputeServiceAdapter must return each existing image, for each location. One image for each different location. * The providerId of the image must be set to the *real* id of the image in the provider. * The "id" of the image is the one jclouds will use to identify it (for example when calling the `geImage(id)` in the ComputeService or when using the `imageId` template option. If the same image id is available in multiple locations, usually providers encode the region in this field. Something like: "us-west-1/image-id". If ids are unique it is ok to use the same id for the providerId and the id (what the `ids` method in the builder does). Otherwise you'll have to make the "id" field able to distinguish between each image in each region. You can have a look at how the OpenStack provider uses the [RegionAndId](https://github.com/jclouds/jclouds/blob/master/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/regionscoped/RegionAndId.java) class. * Finally, if images are by default available in **all** locations, the "location" field should be left null, otherwise it should be set to the right location (region) instead of being set to the PROVIDER scoped one. You can do this by injecting the locations supplier here as you do in the `ServerToNodeMetadata` to find the location where the image is available. This assumes that the ComputeService returns one copy of the image for each location where it is available, so you can make sure you return there all you need to build this properly here. --- Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs/pull/145/files#r25766050
