1 /* 2 * Copyright (c) 2016 ingenieux Labs 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package br.com.ingenieux.mojo.beanstalk.env; 18 19 import com.amazonaws.services.elasticbeanstalk.model.ConfigurationOptionSetting; 20 import com.amazonaws.services.elasticbeanstalk.model.OptionSpecification; 21 22 import org.apache.maven.plugin.AbstractMojoExecutionException; 23 import org.apache.maven.plugins.annotations.Mojo; 24 import org.apache.maven.plugins.annotations.Parameter; 25 26 import br.com.ingenieux.mojo.beanstalk.AbstractNeedsEnvironmentMojo; 27 import br.com.ingenieux.mojo.beanstalk.cmd.env.update.UpdateEnvironmentCommand; 28 import br.com.ingenieux.mojo.beanstalk.cmd.env.update.UpdateEnvironmentContext; 29 import br.com.ingenieux.mojo.beanstalk.cmd.env.update.UpdateEnvironmentContextBuilder; 30 31 /** 32 * Updates the environment versionLabel for a given environmentName <p> See the <a href= 33 * "http://docs.amazonwebservices.com/elasticbeanstalk/latest/api/API_UpdateEnvironment.html" 34 * >UpdateEnvironment API</a> call. 35 * 36 * @since 0.2.0 37 */ 38 @Mojo(name = "update-environment") 39 public class UpdateEnvironmentMojo extends AbstractNeedsEnvironmentMojo { 40 41 /** 42 * Version Label to use 43 */ 44 @Parameter(property = "beanstalk.versionLabel") 45 String versionLabel; 46 47 /** 48 * Application Description 49 */ 50 @Parameter(property = "beanstalk.environmentDescription") 51 String environmentDescription; 52 53 /** 54 * <p> Configuration Option Settings. Will evaluate as such: </p> <p> <p> If empty, will lookup 55 * for beanstalk.env.aws.x.y variable in the context, and it will map this variable to namespace 56 * [aws.x], under option name y, unless there's an alias set. </p> <p> <p> A Property might be 57 * aliased. Current aliases include: </p> <p> <ul> <li>beanstalk.scalingAvailabilityZones, to 58 * aws:autoscaling:asg/Availability Zones</li> <li>beanstalk.scalingCooldown, to 59 * aws:autoscaling:asg/Cooldown</li> <li>beanstalk.scalingCustomAvailabilityZones, to 60 * aws:autoscaling:asg/Custom Availability Zones</li> <li>beanstalk.scalingMinSize, to 61 * aws:autoscaling:asg/MinSize</li> <li>beanstalk.scalingMaxSize, to 62 * aws:autoscaling:asg/MaxSize</li> <li>beanstalk.availabilityZones, to 63 * aws:autoscaling:asg/Custom Availability Zones (SAME AS beanstalk.scalingCustomAvailabilityZones 64 * FOR BACKWARD COMPATIBILITY</li> <p> <li>beanstalk.keyName, to aws:autoscaling:launchconfiguration/EC2KeyName 65 * (EC2 Instance Key)</li> <li>beanstalk.iamInstanceProfile, to aws:autoscaling:launchconfiguration/IamInstanceProfile 66 * (IAM Instance Profile Role Name)</li> <li>beanstalk.imageId, to 67 * aws:autoscaling:launchconfiguration/ImageId</li> <li>beanstalk.instanceType, to 68 * aws:autoscaling:launchconfiguration/InstanceType (EC2 Instance Type to Use)</li> 69 * <li>beanstalk.monitoringInterval, to aws:autoscaling:launchconfiguration/MonitoringInterval</li> 70 * <li>beanstalk.securityGroups, to aws:autoscaling:launchconfiguration/SecurityGroups</li> 71 * <li>beanstalk.sshSourceRestriction, to aws:autoscaling:launchconfiguration/SSHSourceRestriction</li> 72 * <li>beanstalk.blockDeviceMappings, to aws:autoscaling:launchconfiguration/BlockDeviceMappings</li> 73 * <li>beanstalk.rootVolumeType, to aws:autoscaling:launchconfiguration/RootVolumeType</li> 74 * <li>beanstalk.rootVolumeSize, to aws:autoscaling:launchconfiguration/RootVolumeSize</li> 75 * <li>beanstalk.rootVolumeIOPS, to aws:autoscaling:launchconfiguration/RootVolumeIOPS</li> <p> 76 * <li>beanstalk.triggerBreachDuration, to aws:autoscaling:trigger/BreachDuration</li> 77 * <li>beanstalk.triggerLowerBreachScaleIncrement, to aws:autoscaling:trigger/LowerBreachScaleIncrement</li> 78 * <li>beanstalk.triggerLowerThreshold, to aws:autoscaling:trigger/LowerThreshold</li> 79 * <li>beanstalk.triggerMeasureName, to aws:autoscaling:trigger/MeasureName</li> 80 * <li>beanstalk.triggerPeriod, to aws:autoscaling:trigger/Period</li> 81 * <li>beanstalk.triggerStatistic, to aws:autoscaling:trigger/Statistic</li> 82 * <li>beanstalk.triggerUnit, to aws:autoscaling:trigger/Unit</li> 83 * <li>beanstalk.triggerUpperBreachScaleIncrement, to aws:autoscaling:trigger/UpperBreachScaleIncrement</li> 84 * <li>beanstalk.triggerUpperThreshold, to aws:autoscaling:trigger/UpperThreshold</li> <p> 85 * <li>beanstalk.rollingupdateMaxBatchSize, to aws:autoscaling:updatepolicy:rollingupdate/MaxBatchSize</li> 86 * <li>beanstalk.rollingupdateMinInstancesInService, to aws:autoscaling:updatepolicy:rollingupdate/MinInstancesInService</li> 87 * <li>beanstalk.rollingupdatePauseTime, to aws:autoscaling:updatepolicy:rollingupdate/PauseTime</li> 88 * <li>beanstalk.rollingupdateEnabled, to aws:autoscaling:updatepolicy:rollingupdate/RollingUpdateEnabled</li> 89 * <p> <li>beanstalk.vpcId, to aws:ec2:vpc/VPCId</li> <li>beanstalk.vpcSubnets, to 90 * aws:ec2:vpc/Subnets</li> <li>beanstalk.vpcELBSubnets, to aws:ec2:vpc/ELBSubnets</li> 91 * <li>beanstalk.vpcELBScheme, to aws:ec2:vpc/ELBScheme</li> <li>beanstalk.vpcDBSubnets, to 92 * aws:ec2:vpc/DBSubnets</li> <li>beanstalk.vpcAssociatePublicIpAddress, to 93 * aws:ec2:vpc/AssociatePublicIpAddress</li> <p> <li>beanstalk.applicationHealthCheckURL, to 94 * aws:elasticbeanstalk:application/Application Healthcheck URL (Application Healthcheck 95 * URL)</li> <p> <li>beanstalk.timeout, to aws:elasticbeanstalk:command/Timeout</li> <p> 96 * <li>beanstalk.environmentType, to aws:elasticbeanstalk:environment/EnvironmentType 97 * (SingleInstance or ELB-bound Environment)</li> <p> <li>beanstalk.automaticallyTerminateUnhealthyInstances, 98 * to aws:elasticbeanstalk:monitoring/Automatically Terminate Unhealthy Instances (true if 99 * should automatically terminate instances)</li> <p> <li>beanstalk.notificationEndpoint, to 100 * aws:elasticbeanstalk:sns:topics/Notification Endpoint</li> <li>beanstalk.notificationProtocol, 101 * to aws:elasticbeanstalk:sns:topics/Notification Protocol</li> <li>beanstalk.notificationTopicARN, 102 * to aws:elasticbeanstalk:sns:topics/Notification Topic ARN</li> <li>beanstalk.notificationTopicName, 103 * to aws:elasticbeanstalk:sns:topics/Notification Topic Name</li> <p> 104 * <li>beanstalk.sqsdWorkerQueueUrl, to aws:elasticbeanstalk:sqsd/WorkerQueueURL</li> 105 * <li>beanstalk.sqsdHttpPath, to aws:elasticbeanstalk:sqsd/HttpPath</li> 106 * <li>beanstalk.sqsdMimeType, to aws:elasticbeanstalk:sqsd/MimeType</li> 107 * <li>beanstalk.sqsdHttpConnections, to aws:elasticbeanstalk:sqsd/HttpConnections</li> 108 * <li>beanstalk.sqsdConnectTimeout, to aws:elasticbeanstalk:sqsd/ConnectTimeout</li> 109 * <li>beanstalk.sqsdInactivityTimeout, to aws:elasticbeanstalk:sqsd/InactivityTimeout</li> 110 * <li>beanstalk.sqsdVisibilityTimeout, to aws:elasticbeanstalk:sqsd/VisibilityTimeout</li> 111 * <li>beanstalk.sqsdRetentionPeriod, to aws:elasticbeanstalk:sqsd/RetentionPeriod</li> 112 * <li>beanstalk.sqsdMaxRetries, to aws:elasticbeanstalk:sqsd/MaxRetries</li> <p> 113 * <li>beanstalk.healthcheckHealthyThreshold, to aws:elb:healthcheck/HealthyThreshold</li> 114 * <li>beanstalk.healthcheckInterval, to aws:elb:healthcheck/Interval</li> 115 * <li>beanstalk.healthcheckTimeout, to aws:elb:healthcheck/Timeout</li> 116 * <li>beanstalk.healthcheckUnhealthyThreshold, to aws:elb:healthcheck/UnhealthyThreshold</li> 117 * <p> <li>beanstalk.loadBalancerHTTPPort, to aws:elb:loadbalancer/LoadBalancerHTTPPort</li> 118 * <li>beanstalk.loadBalancerPortProtocol, to aws:elb:loadbalancer/LoadBalancerPortProtocol</li> 119 * <li>beanstalk.loadBalancerHTTPSPort, to aws:elb:loadbalancer/LoadBalancerHTTPSPort</li> 120 * <li>beanstalk.loadBalancerSSLPortProtocol, to aws:elb:loadbalancer/LoadBalancerSSLPortProtocol</li> 121 * <li>beanstalk.loadBalancerSSLCertificateId, to aws:elb:loadbalancer/SSLCertificateId</li> 122 * <p> <li>beanstalk.stickinessCookieExpiration, to aws:elb:policies/Stickiness Cookie 123 * Expiration (Stickiness Cookie Expiration Timeout)</li> <li>beanstalk.stickinessPolicy, to 124 * aws:elb:policies/Stickiness Policy (ELB Stickiness Policy)</li> <p> 125 * <li>beanstalk.dbAllocatedStorage, to aws:rds:dbinstance/DBAllocatedStorage</li> 126 * <li>beanstalk.dbDeletionPolicy, to aws:rds:dbinstance/DBDeletionPolicy</li> 127 * <li>beanstalk.dbEngine, to aws:rds:dbinstance/DBEngine</li> <li>beanstalk.dbEngineVersion, to 128 * aws:rds:dbinstance/DBEngineVersion</li> <li>beanstalk.dbInstanceClass, to 129 * aws:rds:dbinstance/DBInstanceClass</li> <li>beanstalk.dbPassword, to 130 * aws:rds:dbinstance/DBPassword</li> <li>beanstalk.dbSnapshotIdentifier, to 131 * aws:rds:dbinstance/DBSnapshotIdentifier</li> <li>beanstalk.dbUser, to 132 * aws:rds:dbinstance/DBUser</li> <li>beanstalk.dbMultiAZDatabase, to 133 * aws:rds:dbinstance/MultiAZDatabase</li> <p> <li>beanstalk.environmentAwsSecretKey, to 134 * aws:elasticbeanstalk:application:environment/AWS_SECRET_KEY</li> 135 * <li>beanstalk.environmentAwsAccessKeyId, to aws:elasticbeanstalk:application:environment/AWS_ACCESS_KEY_ID</li> 136 * <li>beanstalk.environmentJdbcConnectionString, to aws:elasticbeanstalk:application:environment/JDBC_CONNECTION_STRING</li> 137 * <li>beanstalk.environmentParam1, to aws:elasticbeanstalk:application:environment/PARAM1</li> 138 * <li>beanstalk.environmentParam2, to aws:elasticbeanstalk:application:environment/PARAM2</li> 139 * <li>beanstalk.environmentParam3, to aws:elasticbeanstalk:application:environment/PARAM3</li> 140 * <li>beanstalk.environmentParam4, to aws:elasticbeanstalk:application:environment/PARAM4</li> 141 * <li>beanstalk.environmentParam5, to aws:elasticbeanstalk:application:environment/PARAM5</li> 142 * <p> <li>beanstalk.logPublicationControl, to aws:elasticbeanstalk:hostmanager/LogPublicationControl</li> 143 * <p> <li>beanstalk.jvmOptions, to aws:elasticbeanstalk:container:tomcat:jvmoptions/JVM 144 * Options</li> <li>beanstalk.jvmXmx, to aws:elasticbeanstalk:container:tomcat:jvmoptions/Xmx</li> 145 * <li>beanstalk.jvmMaxPermSize, to aws:elasticbeanstalk:container:tomcat:jvmoptions/XX:MaxPermSize</li> 146 * <li>beanstalk.jvmXms, to aws:elasticbeanstalk:container:tomcat:jvmoptions/Xms</li> <p> 147 * <li>beanstalk.phpDocumentRoot, to aws:elasticbeanstalk:container:php:phpini/document_root</li> 148 * <li>beanstalk.phpMemoryLimit, to aws:elasticbeanstalk:container:php:phpini/memory_limit</li> 149 * <li>beanstalk.phpZlibOutputCompression, to aws:elasticbeanstalk:container:php:phpini/zlib.output_compression</li> 150 * <li>beanstalk.phpAllowUrlFopen, to aws:elasticbeanstalk:container:php:phpini/allow_url_fopen</li> 151 * <li>beanstalk.phpDisplayErrors, to aws:elasticbeanstalk:container:php:phpini/display_errors</li> 152 * <li>beanstalk.phpMaxExecutionTime, to aws:elasticbeanstalk:container:php:phpini/max_execution_time</li> 153 * <li>beanstalk.phpComposerOptions, to aws:elasticbeanstalk:container:php:phpini/composer_options</li> 154 * </ul> <p> The reason for most of those aliases if the need to address space and ':' inside 155 * Maven Properties and XML Files. 156 */ 157 @Parameter ConfigurationOptionSetting[] optionSettings; 158 159 @Parameter OptionSpecification[] optionsToRemove; 160 161 /** 162 * <p> Template Name. </p> <p> <p> Could be either literal or a glob, like, <p> 163 * <pre> 164 * ingenieux-services-prod-* 165 * </pre> 166 * <p> . If a glob, there will be a lookup involved, and the first one in reverse ASCIIbetical 167 * order will be picked upon. </p> 168 */ 169 @Parameter(property = "beanstalk.templateName") 170 String templateName; 171 172 /** 173 * <p>Environment Tier Name (defaults to "WebServer")</p> 174 */ 175 @Parameter(property = "beanstalk.environmentTierName", defaultValue = "WebServer") 176 String environmentTierName; 177 178 /** 179 * <p>Environment Tier Type</p> 180 */ 181 @Parameter(property = "beanstalk.environmentTierType") 182 String environmentTierType; 183 184 /** 185 * <p>Environment Tier Version</p> 186 */ 187 @Parameter(property = "beanstalk.environmentTierVersion") 188 String environmentTierVersion; 189 190 protected Object executeInternal() throws AbstractMojoExecutionException { 191 versionLabel = lookupVersionLabel(applicationName, versionLabel); 192 193 waitForNotUpdating(); 194 195 if (null == optionSettings) { 196 optionSettings = super.introspectOptionSettings(); 197 } 198 199 UpdateEnvironmentContextBuilder builder = 200 UpdateEnvironmentContextBuilder.updateEnvironmentContext() 201 .withEnvironmentId(curEnv.getEnvironmentId()) // 202 .withEnvironmentDescription(environmentDescription) // 203 .withEnvironmentName(curEnv.getEnvironmentName()) // 204 .withOptionSettings(optionSettings) // 205 .withOptionsToRemove(optionsToRemove) // 206 .withTemplateName(lookupTemplateName(applicationName, templateName)) // 207 .withVersionLabel(versionLabel) // 208 .withEnvironmentTierType(environmentTierType) // 209 .withEnvironmentTierName(environmentTierName) // 210 .withEnvironmentTierVersion(environmentTierVersion) // 211 .withLatestVersionLabel(curEnv.getVersionLabel()); 212 213 UpdateEnvironmentContext context = builder.build(); 214 UpdateEnvironmentCommandpdate/UpdateEnvironmentCommand.html#UpdateEnvironmentCommand">UpdateEnvironmentCommand command = new UpdateEnvironmentCommand(this); 215 216 return command.execute(context); 217 } 218 }