use of io.fabric8.karaf.checks.Check in project che by eclipse.
the class OpenShiftConnector method tag.
/**
* Creates an ImageStreamTag that tracks a given image.
*
* <p> Docker tags are used extensively in Che: all workspaces run on tagged images
* tracking built stacks. For new workspaces, or when snapshots are not used, the
* tracked image is e.g. {@code eclipse/ubuntu_jdk8}, whereas for snapshotted workspaces,
* the tracked image is the snapshot (e.g. {@code machine_snapshot-<identifier>}.
*
* <p> Since OpenShift does not support the same tagging functionality as Docker,
* tags are implemented as ImageStreamTags, where the {@code From} field is always
* the original image, and the ImageStreamTag name is derived from both the source
* image and the target image. This replicates functionality for Che in Docker,
* while working differently under the hood. The ImageStream name is derived from
* the image that is being tracked (e.g. {@code eclipse/ubuntu_jdk8}), while the tag
* name is derived from the target image (e.g. {@code eclipse-che/che_workspace<identifier>}).
*
* @see DockerConnector#tag(TagParams)
*/
@Override
public void tag(final TagParams params) throws IOException {
// E.g. `docker tag sourceImage targetImage`
// e.g. eclipse/ubuntu_jdk8
String paramsSourceImage = params.getImage();
// e.g. eclipse-che/<identifier>
String targetImage = params.getRepository();
String paramsTag = params.getTag();
String sourceImage = KubernetesStringUtils.stripTagFromPullSpec(paramsSourceImage);
String tag = KubernetesStringUtils.getTagNameFromPullSpec(paramsSourceImage);
if (isNullOrEmpty(tag)) {
tag = !isNullOrEmpty(paramsTag) ? paramsTag : "latest";
}
String sourceImageWithTag;
// Check if sourceImage matches existing imageStreamTag (e.g. when tagging a snapshot)
try {
String sourceImageTagName = KubernetesStringUtils.convertPullSpecToTagName(sourceImage);
ImageStreamTag existingTag = getImageStreamTagFromRepo(sourceImageTagName);
sourceImageWithTag = existingTag.getTag().getFrom().getName();
} catch (IOException e) {
// Image not found.
sourceImageWithTag = String.format("%s:%s", sourceImage, tag);
}
String imageStreamTagName = KubernetesStringUtils.createImageStreamTagName(sourceImageWithTag, targetImage);
createImageStreamTag(sourceImageWithTag, imageStreamTagName);
}
use of io.fabric8.karaf.checks.Check in project carbon-apimgt by wso2.
the class ServiceDiscovererKubernetes method buildConfig.
/**
* Builds the Config required by DefaultOpenShiftClient
* Also sets the system properties
* (1) to not refer .kube/config file and
* (2) the client to use service account procedure to get authenticated and authorised
*
* @return {@link io.fabric8.kubernetes.client.Config} object to build the client
* @throws ServiceDiscoveryException if an error occurs while building the config using externally stored token
*/
private Config buildConfig(Map<String, String> implParameters) throws ServiceDiscoveryException, APIMgtDAOException {
System.setProperty(TRY_KUBE_CONFIG, "false");
System.setProperty(TRY_SERVICE_ACCOUNT, "true");
/*
* Common to both situations,
* - Token found inside APIM pod
* - Token stored in APIM resources/security folder }
*/
ConfigBuilder configBuilder = new ConfigBuilder().withMasterUrl(implParameters.get(MASTER_URL)).withCaCertFile(implParameters.get(CA_CERT_PATH));
/*
* Check if a service account token File Name is given in the configuration
* - if not : assume APIM is running inside a pod and look for the pod's token
*/
String externalSATokenFileName = implParameters.get(EXTERNAL_SA_TOKEN_FILE_NAME);
if (StringUtils.isEmpty(externalSATokenFileName)) {
log.debug("Looking for service account token in " + POD_MOUNTED_SA_TOKEN_FILE_PATH);
String podMountedSAToken = APIFileUtils.readFileContentAsText(implParameters.get(POD_MOUNTED_SA_TOKEN_FILE_PATH));
return configBuilder.withOauthToken(podMountedSAToken).build();
} else {
log.info("Using externally stored service account token");
return configBuilder.withOauthToken(resolveToken("encrypted" + externalSATokenFileName)).build();
}
}
use of io.fabric8.karaf.checks.Check in project carbon-apimgt by wso2.
the class KubernetesGatewayImpl method createDeploymentResource.
/**
* Create a deployment in cms
*
* @param deploymentTemplate Deployment template as a String
* @param deploymentName Name of the deployment
* @throws ContainerBasedGatewayException if failed to create a deployment
*/
private void createDeploymentResource(String deploymentTemplate, String deploymentName) throws ContainerBasedGatewayException {
HasMetadata resource = getResourcesFromTemplate(deploymentTemplate);
try {
if (resource instanceof Deployment) {
// check whether there are existing service already
if (client.extensions().deployments().inNamespace(namespace).withName(deploymentName).get() == null) {
log.debug("Deploying in CMS type: {} and the Deployment resource definition: {} ", cmsType, deploymentTemplate);
Deployment deployment = (Deployment) resource;
Deployment result = client.extensions().deployments().inNamespace(namespace).create(deployment);
log.info("Created Deployment : " + result.getMetadata().getName() + " in Namespace : " + result.getMetadata().getNamespace() + " in " + cmsType);
} else {
log.info("There exist a deployment with the same name in " + cmsType + ". Deployment name : " + deploymentName);
}
} else {
throw new ContainerBasedGatewayException("Loaded Resource is not a Deployment in " + cmsType + "! " + resource, ExceptionCodes.LOADED_RESOURCE_DEFINITION_IS_NOT_VALID);
}
} catch (KubernetesClientException e) {
throw new ContainerBasedGatewayException("Error while creating container based gateway deployment in " + cmsType + "!", e, ExceptionCodes.DEDICATED_CONTAINER_GATEWAY_CREATION_FAILED);
}
}
use of io.fabric8.karaf.checks.Check in project carbon-apimgt by wso2.
the class KubernetesGatewayImpl method createIngressResource.
/**
* Create an Ingress resource in cms
*
* @param ingressTemplate Ingress template as a String
* @param ingressName Name of the ingress
* @throws ContainerBasedGatewayException if failed to create a service
*/
private void createIngressResource(String ingressTemplate, String ingressName) throws ContainerBasedGatewayException {
HasMetadata resource = getResourcesFromTemplate(ingressTemplate);
try {
if (resource instanceof Ingress) {
// check whether there are existing service already
if (client.extensions().ingresses().inNamespace(namespace).withName(ingressName).get() == null) {
log.debug("Deploying in CMS type: {} and the Ingress resource definition: {} ", cmsType, ingressTemplate);
Ingress ingress = (Ingress) resource;
Ingress result = client.extensions().ingresses().inNamespace(namespace).create(ingress);
log.info("Created Ingress : " + result.getMetadata().getName() + " in Namespace : " + result.getMetadata().getNamespace() + " in " + cmsType);
} else {
log.info("There exist an ingress with the same name in " + cmsType + ". Ingress name : " + ingressName);
}
} else {
throw new ContainerBasedGatewayException("Loaded Resource is not a Service in " + cmsType + "! " + resource, ExceptionCodes.LOADED_RESOURCE_DEFINITION_IS_NOT_VALID);
}
} catch (KubernetesClientException e) {
throw new ContainerBasedGatewayException("Error while creating container based gateway ingress in " + cmsType + "!", e, ExceptionCodes.DEDICATED_CONTAINER_GATEWAY_CREATION_FAILED);
}
}
use of io.fabric8.karaf.checks.Check in project carbon-apimgt by wso2.
the class ServiceDiscovererKubernetes method listServices.
/**
* {@inheritDoc}
*/
@Override
public List<Endpoint> listServices(Map<String, String> criteria) throws ServiceDiscoveryException {
List<Endpoint> endpointList = new ArrayList<>();
if (client != null) {
log.debug("Looking for services, with the specified labels, in all namespaces");
try {
// namespace has to be set to null to check all allowed namespaces
List<Service> serviceList = client.services().inNamespace(null).withLabels(criteria).list().getItems();
addServicesToEndpointList(serviceList, endpointList);
} catch (KubernetesClientException | MalformedURLException e) {
String msg = "Error occurred while trying to list services using Kubernetes client";
throw new ServiceDiscoveryException(msg, e, ExceptionCodes.ERROR_WHILE_TRYING_TO_DISCOVER_SERVICES);
} catch (NoSuchMethodError e) {
String msg = "Filtering criteria in the deployment yaml includes unwanted characters";
throw new ServiceDiscoveryException(msg, e, ExceptionCodes.ERROR_WHILE_TRYING_TO_DISCOVER_SERVICES);
}
}
return endpointList;
}
Aggregations