ApplicationResource implements IApplicationResource { @Override public Response changeInstanceState( String applicationName, String newState, String instancePath ) { this.logger.fine( "Request: change state of " + instancePath + " to '" + newState + "' in " + applicationName + "." ); Response response = Response.ok().build(); String lang = lang( this.manager ); try { ManagedApplication ma; Instance instance; if( ! InstanceStatus.isValidState( newState )) response = handleError( Status.FORBIDDEN, new RestError( REST_INEXISTING, name( newState )), lang ).build(); else if(( ma = this.manager.applicationMngr().findManagedApplicationByName( applicationName )) == null ) response = handleError( Status.NOT_FOUND, new RestError( REST_INEXISTING, application( applicationName )), lang ).build(); else if(( instance = InstanceHelpers.findInstanceByPath( ma.getApplication(), instancePath )) == null ) response = handleError( Status.NOT_FOUND, new RestError( REST_INEXISTING, instance( instancePath ), application( applicationName )), lang ).build(); else this.manager.instancesMngr().changeInstanceState( ma, instance, InstanceStatus.whichStatus( newState )); } catch( IOException | TargetException e ) { response = RestServicesUtils.handleError( Status.FORBIDDEN, new RestError( ErrorCode.REST_UNDETAILED_ERROR, e ), lang ).build(); } catch( Exception e ) { response = RestServicesUtils.handleError( Status.INTERNAL_SERVER_ERROR, new RestError( ErrorCode.REST_UNDETAILED_ERROR, e ), lang ).build(); } return response; } ApplicationResource( Manager manager ); @Override Response changeInstanceState( String applicationName, String newState, String instancePath ); @Override Response setDescription( String applicationName, String desc ); @Override Response deployAndStartAll( String applicationName, String instancePath ); @Override Response stopAll( String applicationName, String instancePath ); @Override Response undeployAll( String applicationName, String instancePath ); @Override List<Instance> listChildrenInstances( String applicationName, String instancePath, boolean allChildren ); @Override Response bindApplication( String applicationName, String externalExportPrefix, String boundApp ); @Override Response unbindApplication( String applicationName, String externalExportPrefix, String boundApp ); @Override Response replaceApplicationBindings( String applicationName, String externalExportPrefix, List<String> boundApps ); @Override Response getApplicationBindings( String applicationName ); @Override Response addInstance( String applicationName, String parentInstancePath, Instance instance ); @Override Response removeInstance( String applicationName, String instancePath ); @Override List<TargetAssociation> findTargetAssociations( String applicationName ); @Override Response resynchronize( String applicationName ); @Override List<Component> listComponents( String applicationName ); @Override List<Component> findComponentChildren( String applicationName, String componentName ); @Override List<Component> findComponentAncestors( String applicationName, String componentName ); @Override List<String> listCommands( String app ); @Override Response executeCommand( String app, String commandName ); @Override Response getCommandInstructions( String appName, String commandName ); @Override Response replaceTags( String name, String version, List<String> tags );  }
@Test public void testChangeState_inexistingApplication() throws Exception { Response resp = this.resource.changeInstanceState( "inexisting", InstanceStatus.DEPLOYED_STARTED.toString(), null ); Assert.assertEquals( Status.NOT_FOUND.getStatusCode(), resp.getStatus()); }
@Test public void testChangeState_inexistingInstance_null() throws Exception { Response resp = this.resource.changeInstanceState( this.app.getName(), InstanceStatus.DEPLOYED_STARTED.toString(), null ); Assert.assertEquals( Status.NOT_FOUND.getStatusCode(), resp.getStatus()); }
@Test public void testChangeState_inexistingInstance() throws Exception { Response resp = this.resource.changeInstanceState( this.app.getName(), InstanceStatus.DEPLOYED_STARTED.toString(), "/bip/bip" ); Assert.assertEquals( Status.NOT_FOUND.getStatusCode(), resp.getStatus()); }
@Test public void testChangeState_invalidAction() throws Exception { Response resp = this.resource.changeInstanceState( this.app.getName(), null, null ); Assert.assertEquals( Status.FORBIDDEN.getStatusCode(), resp.getStatus()); }
@Test public void testChangeState_invalidActionAgain() throws Exception { Response resp = this.resource.changeInstanceState( this.app.getName(), "oops", null ); Assert.assertEquals( Status.FORBIDDEN.getStatusCode(), resp.getStatus()); }
@Test public void testChangeState_deployRoot_success() throws Exception { TestTargetResolver iaasResolver = new TestTargetResolver(); this.manager.setTargetResolver( iaasResolver ); String targetId = this.manager.targetsMngr().createTarget( "id: tid\nhandler: test" ); this.manager.targetsMngr().associateTargetWith( targetId, this.app, null ); Assert.assertEquals( 0, iaasResolver.instancePathToRunningStatus.size()); Response resp = this.resource.changeInstanceState( this.app.getName(), InstanceStatus.DEPLOYED_STARTED.toString(), InstanceHelpers.computeInstancePath( this.app.getMySqlVm())); String path = InstanceHelpers.computeInstancePath( this.app.getMySqlVm()); Assert.assertEquals( Status.OK.getStatusCode(), resp.getStatus()); Assert.assertEquals( 1, iaasResolver.instancePathToRunningStatus.size()); Assert.assertTrue( iaasResolver.instancePathToRunningStatus.get( path )); }
@Test public void testChangeState_deploy_success() throws Exception { Assert.assertEquals( 0, this.msgClient.allSentMessages.size()); Assert.assertEquals( 0, this.ma.removeAwaitingMessages( this.app.getTomcatVm()).size()); String instancePath = InstanceHelpers.computeInstancePath( this.app.getTomcat()); Response resp = this.resource.changeInstanceState( this.app.getName(), InstanceStatus.DEPLOYED_STOPPED.toString(), instancePath ); Assert.assertEquals( Status.OK.getStatusCode(), resp.getStatus()); Assert.assertEquals( 0, this.msgClient.allSentMessages.size()); List<Message> messages = this.ma.removeAwaitingMessages( this.app.getTomcatVm()); Assert.assertEquals( 1, messages.size()); Assert.assertEquals( MsgCmdChangeInstanceState.class, messages.get( 0 ).getClass()); Assert.assertEquals( instancePath, ((MsgCmdChangeInstanceState) messages.get( 0 )).getInstancePath()); }
@Test public void testChangeState_TargetException() throws Exception { TestTargetResolver newResolver = new TestTargetResolver() { @Override public TargetHandler findTargetHandler( Map<String,String> targetProperties ) throws TargetException { throw new TargetException( "For test purpose!" ); } }; this.manager.setTargetResolver( newResolver ); String instancePath = InstanceHelpers.computeInstancePath( this.app.getTomcatVm()); Assert.assertEquals( InstanceStatus.NOT_DEPLOYED, this.app.getTomcatVm().getStatus()); Response resp = this.resource.changeInstanceState( this.app.getName(), InstanceStatus.DEPLOYED_STARTED.toString(), instancePath ); Assert.assertEquals( Status.FORBIDDEN.getStatusCode(), resp.getStatus()); Assert.assertEquals( InstanceStatus.NOT_DEPLOYED, this.app.getTomcatVm().getStatus()); }
@Test public void testChangeState_IOException() throws Exception { this.msgClient.connected.set( false ); Assert.assertEquals( 0, this.msgClient.allSentMessages.size()); Assert.assertEquals( 0, this.ma.removeAwaitingMessages( this.app.getTomcatVm()).size()); String instancePath = InstanceHelpers.computeInstancePath( this.app.getTomcat()); Response resp = this.resource.changeInstanceState( this.app.getName(), InstanceStatus.DEPLOYED_STARTED.toString(), instancePath ); Assert.assertEquals( Status.FORBIDDEN.getStatusCode(), resp.getStatus()); Assert.assertEquals( 0, this.msgClient.allSentMessages.size()); List<Message> messages = this.ma.removeAwaitingMessages( this.app.getTomcatVm()); Assert.assertEquals( 0, messages.size()); }