use of org.eclipse.che.plugin.docker.client.json.ImageInfo in project che by eclipse.
the class OpenShiftConnector method getImageInfoFromTag.
/**
* Extracts the ImageInfo stored in an ImageStreamTag. The returned object is the JSON
* that would be returned by executing {@code docker inspect <image>}, except, due to a quirk
* in OpenShift's handling of this data, fields except for {@code Config} and {@code ContainerConfig}
* are null.
* @param imageStreamTag
* @return
*/
private ImageInfo getImageInfoFromTag(ImageStreamTag imageStreamTag) {
// The DockerImageConfig string here is the JSON that would be returned by a docker inspect image,
// except that the capitalization is inconsistent, breaking deserialization. Top level elements
// are lowercased with underscores, while nested elements conform to FieldNamingPolicy.UPPER_CAMEL_CASE.
// We're only converting the config fields for brevity; this means that other fields are null.
String dockerImageConfig = imageStreamTag.getImage().getDockerImageConfig();
ImageInfo info = GSON.fromJson(dockerImageConfig.replaceFirst("config", "Config").replaceFirst("container_config", "ContainerConfig"), ImageInfo.class);
return info;
}
use of org.eclipse.che.plugin.docker.client.json.ImageInfo in project che by eclipse.
the class DockerConnectorTest method shouldBeAbleToInspectImage.
@Test
public void shouldBeAbleToInspectImage() throws IOException, JsonParseException {
InspectImageParams inspectImageParams = InspectImageParams.create(IMAGE);
ImageInfo imageInfo = mock(ImageInfo.class);
doReturn(imageInfo).when(dockerConnector).parseResponseStreamAndClose(inputStream, ImageInfo.class);
ImageInfo returnedImageInfo = dockerConnector.inspectImage(inspectImageParams);
verify(dockerConnectionFactory).openConnection(any(URI.class));
verify(dockerConnection).method(REQUEST_METHOD_GET);
verify(dockerConnection).path("/images/" + inspectImageParams.getImage() + "/json");
verify(dockerConnection).request();
verify(dockerResponse).getStatus();
verify(dockerResponse).getInputStream();
assertEquals(returnedImageInfo, imageInfo);
}
use of org.eclipse.che.plugin.docker.client.json.ImageInfo in project che by eclipse.
the class DockerConnectorTest method shouldCallInspectImageWithParametersObject.
@Test
public void shouldCallInspectImageWithParametersObject() throws IOException {
InspectImageParams inspectImageParams = InspectImageParams.create(IMAGE);
ImageInfo imageInfo = mock(ImageInfo.class);
doReturn(imageInfo).when(dockerConnector).inspectImage(any(InspectImageParams.class));
ImageInfo returnedImageInfo = dockerConnector.inspectImage(IMAGE);
verify(dockerConnector).inspectImage((InspectImageParams) captor.capture());
assertEquals(captor.getValue(), inspectImageParams);
assertEquals(returnedImageInfo, imageInfo);
}
use of org.eclipse.che.plugin.docker.client.json.ImageInfo in project che by eclipse.
the class OpenShiftConnector method createContainerInfo.
/**
* Collects the relevant information from a Service, an ImageInfo, and a Pod into
* a docker ContainerInfo JSON object. The returned object is what would be returned
* by executing {@code docker inspect <container>}, with fields filled as available.
* @param svc
* @param imageInfo
* @param pod
* @param containerId
* @return
*/
private ContainerInfo createContainerInfo(Service svc, ImageInfo imageInfo, Pod pod, String containerId) {
// In Che on OpenShift, we only have one container per pod.
Container container = pod.getSpec().getContainers().get(0);
ContainerConfig imageContainerConfig = imageInfo.getContainerConfig();
// HostConfig
HostConfig hostConfig = new HostConfig();
hostConfig.setBinds(new String[0]);
hostConfig.setMemory(imageInfo.getConfig().getMemory());
// Env vars
List<String> imageEnv = Arrays.asList(imageContainerConfig.getEnv());
List<String> containerEnv = container.getEnv().stream().map(e -> String.format("%s=%s", e.getName(), e.getValue())).collect(Collectors.toList());
String[] env = Stream.concat(imageEnv.stream(), containerEnv.stream()).toArray(String[]::new);
// Exposed Ports
Map<String, List<PortBinding>> ports = getCheServicePorts(svc);
Map<String, Map<String, String>> exposedPorts = new HashMap<>();
for (String key : ports.keySet()) {
exposedPorts.put(key, Collections.emptyMap());
}
// Labels
Map<String, String> annotations = KubernetesLabelConverter.namesToLabels(svc.getMetadata().getAnnotations());
Map<String, String> containerLabels = imageInfo.getConfig().getLabels();
Map<String, String> labels = Stream.concat(annotations.entrySet().stream(), containerLabels.entrySet().stream()).filter(e -> e.getKey().startsWith(KubernetesLabelConverter.getCheServerLabelPrefix())).collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));
// ContainerConfig
ContainerConfig config = imageContainerConfig;
config.setHostname(svc.getMetadata().getName());
config.setEnv(env);
config.setExposedPorts(exposedPorts);
config.setLabels(labels);
config.setImage(container.getImage());
// NetworkSettings
NetworkSettings networkSettings = new NetworkSettings();
networkSettings.setIpAddress(svc.getSpec().getClusterIP());
networkSettings.setGateway(svc.getSpec().getClusterIP());
networkSettings.setPorts(ports);
// Make final ContainerInfo
ContainerInfo info = new ContainerInfo();
info.setId(containerId);
info.setConfig(config);
info.setNetworkSettings(networkSettings);
info.setHostConfig(hostConfig);
info.setImage(imageInfo.getConfig().getImage());
return info;
}
use of org.eclipse.che.plugin.docker.client.json.ImageInfo in project che by eclipse.
the class OpenShiftConnector method inspectContainer.
@Override
public ContainerInfo inspectContainer(String containerId) throws IOException {
Pod pod = getChePodByContainerId(containerId);
if (pod == null) {
LOG.warn("No Pod found by container ID {}", containerId);
return null;
}
List<Container> podContainers = pod.getSpec().getContainers();
if (podContainers.size() > 1) {
throw new OpenShiftException("Multiple Containers found in Pod.");
} else if (podContainers.size() < 1 || isNullOrEmpty(podContainers.get(0).getImage())) {
throw new OpenShiftException(String.format("Container %s not found", containerId));
}
String podPullSpec = podContainers.get(0).getImage();
String tagName = KubernetesStringUtils.getTagNameFromPullSpec(podPullSpec);
ImageStreamTag tag = getImageStreamTagFromRepo(tagName);
ImageInfo imageInfo = getImageInfoFromTag(tag);
String deploymentName = pod.getMetadata().getLabels().get(OPENSHIFT_DEPLOYMENT_LABEL);
if (deploymentName == null) {
LOG.warn("No label {} found for Pod {}", OPENSHIFT_DEPLOYMENT_LABEL, pod.getMetadata().getName());
return null;
}
Service svc = getCheServiceBySelector(OPENSHIFT_DEPLOYMENT_LABEL, deploymentName);
if (svc == null) {
LOG.warn("No Service found by selector {}={}", OPENSHIFT_DEPLOYMENT_LABEL, deploymentName);
return null;
}
return createContainerInfo(svc, imageInfo, pod, containerId);
}
Aggregations