/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.guvnor.ala.docker.config.impl; import java.util.Collection; import java.util.Map; import com.fasterxml.jackson.annotation.JsonIgnore; import org.guvnor.ala.build.maven.model.MavenProject; import org.guvnor.ala.build.maven.model.PlugIn; import org.guvnor.ala.config.CloneableConfig; import org.guvnor.ala.docker.config.DockerProvisioningConfig; import org.guvnor.ala.pipeline.ContextAware; import org.guvnor.ala.runtime.providers.ProviderId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ContextAwareDockerProvisioningConfig implements ContextAware, DockerProvisioningConfig, CloneableConfig<DockerProvisioningConfig> { @JsonIgnore private Map<String, ?> context; private String imageName = "${input.image-name}"; private String portNumber = "${input.port-number}"; private ProviderId providerId; private String dockerPullValue = "${input.docker-pull}"; protected static final Logger LOG = LoggerFactory.getLogger( ContextAwareDockerProvisioningConfig.class ); public ContextAwareDockerProvisioningConfig() { this.imageName = DockerProvisioningConfig.super.getImageName(); this.portNumber = DockerProvisioningConfig.super.getPortNumber(); this.dockerPullValue = DockerProvisioningConfig.super.getDockerPullValue(); } public ContextAwareDockerProvisioningConfig( final String imageName, final String portNumber, final ProviderId providerId, final String dockerPullValue ) { this.imageName = imageName; this.portNumber = portNumber; this.providerId = providerId; this.dockerPullValue = dockerPullValue; } @Override @JsonIgnore public void setContext( final Map<String, ?> context ) { this.context = context; this.providerId = (ProviderId) this.context.get( "docker-provider" ); try { final Object _project = context.get( "project" ); if ( _project != null && _project instanceof MavenProject ) { final Collection<PlugIn> plugIns = ( (MavenProject) _project ).getBuildPlugins(); for ( final PlugIn plugIn : plugIns ) { if ( plugIn.getId().equals( "io.fabric8:docker-maven-plugin" ) ) { final Map<String, Object> _config = (Map<String, Object>) plugIn.getConfiguration().get( "images" ); imageName = getValue( _config, "image" ).get( "name" ).toString(); portNumber = getValue( getValue( getValue( _config, "image" ), "build" ), "ports" ).get( "port" ).toString(); break; } } } } catch ( final Exception ex ) { LOG.warn( "Error failing to parse Maven configuration for Docker Plugin: " + ex.getMessage(), ex); } } private Map<String, Object> getValue( final Map<String, Object> _config, final String key ) { return (Map<String, Object>) _config.get( key ); } @Override public String getImageName() { return imageName; } @Override public String getPortNumber() { return portNumber; } @Override public ProviderId getProviderId() { return providerId; } public void setImageName( String imageName ) { this.imageName = imageName; } public void setPortNumber( String portNumber ) { this.portNumber = portNumber; } @Override public String getDockerPullValue() { return dockerPullValue; } public void setProviderId( ProviderId providerId ) { this.providerId = providerId; } public void setDockerPullValue( String dockerPullValue ) { this.dockerPullValue = dockerPullValue; } @Override public String toString() { return "ContextAwareDockerProvisioningConfig{" + "imageName=" + imageName + ", portNumber=" + portNumber + ", providerId=" + providerId + ", dockerPullValue=" + dockerPullValue + '}'; } @Override public DockerProvisioningConfig asNewClone( final DockerProvisioningConfig origin ) { return new ContextAwareDockerProvisioningConfig( origin.getImageName(), origin.getPortNumber(), origin.getProviderId(), origin.getDockerPullValue() ); } }