diff --git a/management/pom.xml b/management/pom.xml index 4e2637faab1..a8dacfb4e80 100644 --- a/management/pom.xml +++ b/management/pom.xml @@ -281,6 +281,25 @@ ${project.version} + + + + + ${project.groupId} + environment-metadata-manager-api + ${project.version} + + + ${project.groupId} + environment-metadata-manager-impl + ${project.version} + + + ${project.groupId} + environment-metadata-manager-rest + ${project.version} + + diff --git a/management/server/core/bazaar-manager/bazaar-manager-impl/src/main/java/io/subutai/core/bazaarmanager/impl/adapter/BazaaarAdapterImpl.java b/management/server/core/bazaar-manager/bazaar-manager-impl/src/main/java/io/subutai/core/bazaarmanager/impl/adapter/BazaaarAdapterImpl.java index 87a8c2c48c5..b29eaebbe26 100644 --- a/management/server/core/bazaar-manager/bazaar-manager-impl/src/main/java/io/subutai/core/bazaarmanager/impl/adapter/BazaaarAdapterImpl.java +++ b/management/server/core/bazaar-manager/bazaar-manager-impl/src/main/java/io/subutai/core/bazaarmanager/impl/adapter/BazaaarAdapterImpl.java @@ -8,6 +8,8 @@ import org.apache.commons.lang3.StringUtils; +import io.subutai.bazaar.share.common.BazaaarAdapter; +import io.subutai.bazaar.share.event.payload.Payload; import io.subutai.common.dao.DaoManager; import io.subutai.common.environment.Environment; import io.subutai.common.host.ContainerHostInfo; @@ -17,17 +19,16 @@ import io.subutai.common.peer.HostNotFoundException; import io.subutai.common.peer.LocalPeer; import io.subutai.common.util.ServiceLocator; -import io.subutai.core.environment.api.EnvironmentEventListener; -import io.subutai.core.hostregistry.api.HostListener; import io.subutai.core.bazaarmanager.api.BazaarManager; import io.subutai.core.bazaarmanager.api.RestClient; import io.subutai.core.bazaarmanager.api.RestResult; import io.subutai.core.bazaarmanager.api.dao.ConfigDataService; import io.subutai.core.bazaarmanager.impl.dao.ConfigDataServiceImpl; +import io.subutai.core.environment.api.EnvironmentEventListener; +import io.subutai.core.hostregistry.api.HostListener; import io.subutai.core.identity.api.IdentityManager; import io.subutai.core.identity.api.model.User; import io.subutai.core.peer.api.PeerManager; -import io.subutai.bazaar.share.common.BazaaarAdapter; import static java.lang.String.format; @@ -258,6 +259,35 @@ public void notifyContainerDiskUsageExcess( String peerId, String envId, String } + @Override + public void pushEvent( final Payload message ) + { + RestResult result = + getRestClient().post( String.format( "/rest/v1/peers/%s/event", peerId ), message, message.getClass() ); + + if ( !result.isSuccess() ) + { + log.error( "Error pushing event to Bazaar: HTTP {} - {}", result.getStatus(), result.getReasonPhrase() ); + } + } + + + @Override + public Payload getMetaData( final String environmentId, final String type ) + { + RestResult result = getRestClient() + .get( String.format( "/rest/v1/peers/%s/meta/%s/%s", peerId, environmentId, type ), Payload.class ); + + if ( !result.isSuccess() ) + { + log.error( "Error retrieving meta data from Bazaar: HTTP {} - {}", result.getStatus(), + result.getReasonPhrase() ); + } + + return ( Payload ) result.getEntity(); + } + + private void onContainerStateChange( String envId, String contId, String state ) { if ( !isRegistered() ) diff --git a/management/server/core/environment-manager/environment-manager-impl/src/main/java/io/subutai/core/environment/impl/EnvironmentManagerImpl.java b/management/server/core/environment-manager/environment-manager-impl/src/main/java/io/subutai/core/environment/impl/EnvironmentManagerImpl.java index bec4cd8744c..5bd18851d21 100644 --- a/management/server/core/environment-manager/environment-manager-impl/src/main/java/io/subutai/core/environment/impl/EnvironmentManagerImpl.java +++ b/management/server/core/environment-manager/environment-manager-impl/src/main/java/io/subutai/core/environment/impl/EnvironmentManagerImpl.java @@ -1640,6 +1640,21 @@ public void run() } + @Override + public void onContainerDestroyed( final ContainerHostInfo containerInfo ) + { + try + { + ContainerHost containerHost = peerManager.getLocalPeer().getContainerHostById( containerInfo.getId() ); + onContainerDestroyed( containerHost ); + } + catch ( HostNotFoundException ignore ) + { + //no-op + } + } + + protected Long getUserId() { return identityManager.getActiveUser().getId(); diff --git a/management/server/core/environment-manager/environment-manager-impl/src/main/java/io/subutai/core/environment/impl/EnvironmentManagerSecureProxy.java b/management/server/core/environment-manager/environment-manager-impl/src/main/java/io/subutai/core/environment/impl/EnvironmentManagerSecureProxy.java index 7ce1ff20051..0aae0ba9745 100644 --- a/management/server/core/environment-manager/environment-manager-impl/src/main/java/io/subutai/core/environment/impl/EnvironmentManagerSecureProxy.java +++ b/management/server/core/environment-manager/environment-manager-impl/src/main/java/io/subutai/core/environment/impl/EnvironmentManagerSecureProxy.java @@ -30,7 +30,6 @@ import io.subutai.common.environment.Topology; import io.subutai.common.host.ContainerHostInfo; import io.subutai.common.host.ContainerHostState; -import io.subutai.common.host.HostInterfaceModel; import io.subutai.common.host.ResourceHostInfo; import io.subutai.common.metric.QuotaAlertValue; import io.subutai.common.network.SshTunnel; @@ -802,27 +801,9 @@ public void onContainerCreated( final ContainerHostInfo containerInfo ) @Override - public void onContainerNetInterfaceChanged( final ContainerHostInfo containerInfo, - final HostInterfaceModel oldNetInterface, - final HostInterfaceModel newNetInterface ) + public void onContainerDestroyed( final ContainerHostInfo containerInfo ) { - environmentManager.onContainerNetInterfaceChanged( containerInfo, oldNetInterface, newNetInterface ); - } - - - @Override - public void onContainerNetInterfaceAdded( final ContainerHostInfo containerInfo, - final HostInterfaceModel netInterface ) - { - environmentManager.onContainerNetInterfaceAdded( containerInfo, netInterface ); - } - - - @Override - public void onContainerNetInterfaceRemoved( final ContainerHostInfo containerInfo, - final HostInterfaceModel netInterface ) - { - environmentManager.onContainerNetInterfaceRemoved( containerInfo, netInterface ); + environmentManager.onContainerDestroyed( containerInfo ); } diff --git a/management/server/core/environment-metadata-manager/environment-metadata-manager-api/pom.xml b/management/server/core/environment-metadata-manager/environment-metadata-manager-api/pom.xml new file mode 100644 index 00000000000..e0896c5e03b --- /dev/null +++ b/management/server/core/environment-metadata-manager/environment-metadata-manager-api/pom.xml @@ -0,0 +1,50 @@ + + + + environment-metadata-manager + io.subutai + 8.2.1-SNAPSHOT + + 4.0.0 + + environment-metadata-manager-api + Subutai Environment Metadata Manager Api + Subutai Environment Metadata Manager Api + bundle + + + + ${project.groupId} + subutai-common + + + + io.subutai + identity-manager-api + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.felix + maven-bundle-plugin + + + ${project.groupId}.core.environment.metadata.api + + {local-packages};version=${project.version};-noimport:=true + + + + + + + \ No newline at end of file diff --git a/management/server/core/environment-metadata-manager/environment-metadata-manager-api/src/main/java/io/subutai/core/environment/metadata/api/EnvironmentMetadataManager.java b/management/server/core/environment-metadata-manager/environment-metadata-manager-api/src/main/java/io/subutai/core/environment/metadata/api/EnvironmentMetadataManager.java new file mode 100644 index 00000000000..0ccbddfbbdc --- /dev/null +++ b/management/server/core/environment-metadata-manager/environment-metadata-manager-api/src/main/java/io/subutai/core/environment/metadata/api/EnvironmentMetadataManager.java @@ -0,0 +1,23 @@ +package io.subutai.core.environment.metadata.api; + + +import io.subutai.bazaar.share.event.payload.Payload; +import io.subutai.core.identity.api.exception.TokenCreateException; + + +public interface EnvironmentMetadataManager +{ + void init(); + + void dispose(); + + /** + * Issues JWT token for specified container + */ + + void issueToken( String containerIp ) throws TokenCreateException; + + Payload getEnvironmentInfoDto( String environmentId, String type ); + + void pushEvent( Payload eventMessage ); +} diff --git a/management/server/core/environment-metadata-manager/environment-metadata-manager-impl/pom.xml b/management/server/core/environment-metadata-manager/environment-metadata-manager-impl/pom.xml new file mode 100644 index 00000000000..70e3a2ca678 --- /dev/null +++ b/management/server/core/environment-metadata-manager/environment-metadata-manager-impl/pom.xml @@ -0,0 +1,85 @@ + + + + environment-metadata-manager + io.subutai + 8.2.1-SNAPSHOT + + 4.0.0 + + environment-metadata-manager-impl + bundle + Subutai Environment Metadata Manager Impl + Subutai Environment Metadata Manager Impl + + + + ${project.groupId} + environment-metadata-manager-api + + + + ${project.groupId} + peer-manager-api + + + + ${project.groupId} + environment-manager-api + + + + ${project.groupId} + identity-manager-api + + + + ${project.groupId} + bazaar-manager-api + + + + com.nimbusds + nimbus-jose-jwt + + + + + + junit + junit + test + + + + org.mockito + mockito-all + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.felix + maven-bundle-plugin + + + ${project.groupId}.core.environment.metadata.impl + + {local-packages};version=${project.version};-noimport:=true + + * + + + + + + \ No newline at end of file diff --git a/management/server/core/environment-metadata-manager/environment-metadata-manager-impl/src/main/java/io/subutai/core/environment/metadata/impl/EnvironmentMetadataManagerImpl.java b/management/server/core/environment-metadata-manager/environment-metadata-manager-impl/src/main/java/io/subutai/core/environment/metadata/impl/EnvironmentMetadataManagerImpl.java new file mode 100644 index 00000000000..322d617ea7e --- /dev/null +++ b/management/server/core/environment-metadata-manager/environment-metadata-manager-impl/src/main/java/io/subutai/core/environment/metadata/impl/EnvironmentMetadataManagerImpl.java @@ -0,0 +1,97 @@ +package io.subutai.core.environment.metadata.impl; + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.subutai.bazaar.share.common.BazaaarAdapter; +import io.subutai.bazaar.share.event.payload.Payload; +import io.subutai.common.command.CommandException; +import io.subutai.common.command.RequestBuilder; +import io.subutai.common.host.SubutaiOrigin; +import io.subutai.common.peer.ContainerHost; +import io.subutai.common.peer.HostNotFoundException; +import io.subutai.core.environment.api.EnvironmentManager; +import io.subutai.core.environment.metadata.api.EnvironmentMetadataManager; +import io.subutai.core.identity.api.IdentityManager; +import io.subutai.core.identity.api.exception.TokenCreateException; +import io.subutai.core.peer.api.PeerManager; + + +/** + * Environment metadata manager + **/ +public class EnvironmentMetadataManagerImpl implements EnvironmentMetadataManager +{ + private static final Logger LOG = LoggerFactory.getLogger( EnvironmentMetadataManagerImpl.class ); + private final IdentityManager identityManager; + private PeerManager peerManager; + private EnvironmentManager environmentManager; + private BazaaarAdapter bazaarAdapter; + + + public EnvironmentMetadataManagerImpl( PeerManager peerManager, EnvironmentManager environmentManager, + IdentityManager identityManager, BazaaarAdapter bazaaarAdapter ) + { + this.peerManager = peerManager; + this.environmentManager = environmentManager; + this.identityManager = identityManager; + this.bazaarAdapter = bazaaarAdapter; + } + + + @Override + public void init() + { + } + + + @Override + public void dispose() + { + } + + + @Override + public void issueToken( String containerIp ) throws TokenCreateException + { + try + { + ContainerHost container = peerManager.getLocalPeer().getContainerHostByIp( containerIp ); + String environmentId = container.getEnvironmentId().getId(); + String containerId = container.getContainerId().getId(); + String peerId = container.getPeerId(); + final String token = + identityManager.issueJWTToken( new SubutaiOrigin( environmentId, peerId, containerId ) ); + + placeTokenIntoContainer( container, token ); + } + catch ( HostNotFoundException | CommandException e ) + { + throw new TokenCreateException( e.getMessage() ); + } + } + + + @Override + public Payload getEnvironmentInfoDto( final String environmentId, final String type ) + { + return bazaarAdapter.getMetaData( environmentId, type ); + } + + + @Override + public void pushEvent( final Payload eventMessage ) + { + LOG.debug( "Event received: {}", eventMessage ); + bazaarAdapter.pushEvent( eventMessage ); + } + + + private void placeTokenIntoContainer( ContainerHost containerHost, String token ) throws CommandException + { + containerHost.executeAsync( new RequestBuilder( + String.format( "mkdir -p /etc/subutai/ ; echo '%s' > /etc/subutai/jwttoken", token ) ) ); + } +} + diff --git a/management/server/core/environment-metadata-manager/environment-metadata-manager-impl/src/main/resources/OSGI-INF/blueprint/context.xml b/management/server/core/environment-metadata-manager/environment-metadata-manager-impl/src/main/resources/OSGI-INF/blueprint/context.xml new file mode 100644 index 00000000000..86f51e9106b --- /dev/null +++ b/management/server/core/environment-metadata-manager/environment-metadata-manager-impl/src/main/resources/OSGI-INF/blueprint/context.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/management/server/core/environment-metadata-manager/environment-metadata-manager-impl/src/test/java/io/subutai/core/environment/metadata/impl/EnvironmentMetadataManagerImplTest.java b/management/server/core/environment-metadata-manager/environment-metadata-manager-impl/src/test/java/io/subutai/core/environment/metadata/impl/EnvironmentMetadataManagerImplTest.java new file mode 100644 index 00000000000..13b0f42396b --- /dev/null +++ b/management/server/core/environment-metadata-manager/environment-metadata-manager-impl/src/test/java/io/subutai/core/environment/metadata/impl/EnvironmentMetadataManagerImplTest.java @@ -0,0 +1,31 @@ +package io.subutai.core.environment.metadata.impl; + + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + + +@RunWith( MockitoJUnitRunner.class ) +public class EnvironmentMetadataManagerImplTest +{ + + @Mock + EnvironmentMetadataManagerImpl environmentMetadataManager; + + + @Before + public void setup() + { + + } + + + @Test + public void testTokenIssue() + { + + } +} diff --git a/management/server/core/environment-metadata-manager/environment-metadata-manager-rest/pom.xml b/management/server/core/environment-metadata-manager/environment-metadata-manager-rest/pom.xml new file mode 100644 index 00000000000..e4f85da1558 --- /dev/null +++ b/management/server/core/environment-metadata-manager/environment-metadata-manager-rest/pom.xml @@ -0,0 +1,75 @@ + + + + environment-metadata-manager + io.subutai + 8.2.1-SNAPSHOT + + 4.0.0 + + environment-metadata-manager-rest + Subutai Environment Metadata Manager REST + Subutai Environment Metadata Manager REST + bundle + + + + ${project.groupId} + subutai-common + + + + ${project.groupId} + environment-metadata-manager-api + + + + + org.apache.cxf + cxf-rt-frontend-jaxrs + + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${jackson.version} + + + + junit + junit + test + + + + org.mockito + mockito-all + test + + + io.subutai + environment-manager-api + + + + + + + + org.apache.felix + maven-bundle-plugin + + + ${project.groupId}.core.environment.metadata.manager.rest + + {local-packages};version=${project.version};-noimport:=true + + + + + + + + \ No newline at end of file diff --git a/management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/java/io/subutai/core/environment/metadata/rest/RestService.java b/management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/java/io/subutai/core/environment/metadata/rest/RestService.java new file mode 100644 index 00000000000..14cbac60d91 --- /dev/null +++ b/management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/java/io/subutai/core/environment/metadata/rest/RestService.java @@ -0,0 +1,43 @@ +package io.subutai.core.environment.metadata.rest; + + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import io.subutai.bazaar.share.event.payload.Payload; +import io.subutai.common.host.SubutaiOrigin; +import io.subutai.core.identity.api.IdentityManager; + + +/** + * REST endpoint for environment metadata manager + */ +public interface RestService +{ + + @Path( "/token/{containerIp}" ) + @GET + Response issueToken( @PathParam( "containerIp" ) String containerIp ); + + @Path( "/echo/{message}" ) + @GET + Response echo( @HeaderParam( "containerId" ) String containerId, @PathParam( "message" ) String message ); + + @Path( "/info/{type}" ) + @Produces( MediaType.APPLICATION_JSON ) + @GET + Response getEnvironmentDto( @HeaderParam( IdentityManager.SUBUTAI_ORIGIN_HEADER_KEY ) SubutaiOrigin origin, @PathParam( "type" ) String type ); + + @Path( "/event" ) + @Consumes( MediaType.APPLICATION_JSON ) + @POST + Response pushEvent( @HeaderParam( IdentityManager.SUBUTAI_ORIGIN_HEADER_KEY ) SubutaiOrigin origin, + Payload payload ); +} diff --git a/management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/java/io/subutai/core/environment/metadata/rest/RestServiceImpl.java b/management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/java/io/subutai/core/environment/metadata/rest/RestServiceImpl.java new file mode 100644 index 00000000000..60e24b9e92b --- /dev/null +++ b/management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/java/io/subutai/core/environment/metadata/rest/RestServiceImpl.java @@ -0,0 +1,88 @@ +package io.subutai.core.environment.metadata.rest; + + +import java.io.IOException; + +import javax.ws.rs.core.Response; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.databind.JsonNode; + +import io.subutai.bazaar.share.event.payload.CustomPayload; +import io.subutai.bazaar.share.event.payload.Payload; +import io.subutai.bazaar.share.json.JsonUtil; +import io.subutai.common.host.SubutaiOrigin; +import io.subutai.core.environment.metadata.api.EnvironmentMetadataManager; +import io.subutai.core.identity.api.exception.TokenCreateException; + + +public class RestServiceImpl implements RestService +{ + private static Logger LOG = LoggerFactory.getLogger( RestServiceImpl.class ); + + private EnvironmentMetadataManager environmentMetadataManager; + + + public RestServiceImpl( EnvironmentMetadataManager environmentMetadataManager ) + { + this.environmentMetadataManager = environmentMetadataManager; + } + + + @Override + public Response issueToken( String containerIp ) + { + try + { + environmentMetadataManager.issueToken( containerIp ); + LOG.debug( "Token successfully generated." ); + return Response.noContent().build(); + } + catch ( TokenCreateException e ) + { + return Response.status( Response.Status.INTERNAL_SERVER_ERROR ).build(); + } + } + + + @Override + public Response echo( final String containerId, String message ) + { + return Response.ok( String.format( "You are %s and your message is %s.", containerId, message ) ).build(); + } + + + @Override + public Response getEnvironmentDto( final SubutaiOrigin origin, final String type ) + { + Payload environmentInfoDto = + environmentMetadataManager.getEnvironmentInfoDto( origin.getEnvironmentId(), type ); + + if ( environmentInfoDto instanceof CustomPayload ) + { + try + { + JsonNode json = JsonUtil.MAPPER.readTree( ( ( CustomPayload ) environmentInfoDto ).getMessage() ); + return Response.ok( json ).build(); + } + catch ( IOException e ) + { + return Response.serverError().build(); + } + } + else + { + return Response.ok( environmentInfoDto ).build(); + } + } + + + @Override + public Response pushEvent( final SubutaiOrigin origin, final Payload payload ) + { + environmentMetadataManager.pushEvent( payload ); + return Response.noContent().build(); + } +} diff --git a/management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/resources/OSGI-INF/blueprint/context.xml b/management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/resources/OSGI-INF/blueprint/context.xml new file mode 100644 index 00000000000..80b7cd5f75e --- /dev/null +++ b/management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/resources/OSGI-INF/blueprint/context.xml @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/resources/OSGI-INF/blueprint/rest.xml b/management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/resources/OSGI-INF/blueprint/rest.xml new file mode 100644 index 00000000000..03a1da0a97c --- /dev/null +++ b/management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/resources/OSGI-INF/blueprint/rest.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/management/server/core/environment-metadata-manager/pom.xml b/management/server/core/environment-metadata-manager/pom.xml new file mode 100644 index 00000000000..532d918530d --- /dev/null +++ b/management/server/core/environment-metadata-manager/pom.xml @@ -0,0 +1,23 @@ + + + + mgmt-server-core-parent + io.subutai + 8.2.1-SNAPSHOT + + 4.0.0 + + environment-metadata-manager + Subutai Environment Metadata Manager Parent + Subutai Environment Metadata Manager Parent + pom + + + environment-metadata-manager-api + environment-metadata-manager-impl + environment-metadata-manager-rest + + + \ No newline at end of file diff --git a/management/server/core/host-registry/host-registry-api/src/main/java/io/subutai/core/hostregistry/api/HostListener.java b/management/server/core/host-registry/host-registry-api/src/main/java/io/subutai/core/hostregistry/api/HostListener.java index 36cbe4e012e..a712a862aaf 100644 --- a/management/server/core/host-registry/host-registry-api/src/main/java/io/subutai/core/hostregistry/api/HostListener.java +++ b/management/server/core/host-registry/host-registry-api/src/main/java/io/subutai/core/hostregistry/api/HostListener.java @@ -5,7 +5,6 @@ import io.subutai.common.host.ContainerHostInfo; import io.subutai.common.host.ContainerHostState; -import io.subutai.common.host.HostInterfaceModel; import io.subutai.common.host.ResourceHostInfo; import io.subutai.common.metric.QuotaAlertValue; @@ -26,12 +25,13 @@ public void onHeartbeat( ResourceHostInfo resourceHostInfo, Set public void onContainerStateChanged( ContainerHostInfo containerInfo, ContainerHostState previousState, - ContainerHostState currentState ) + ContainerHostState currentState ) { } - public void onContainerHostnameChanged( ContainerHostInfo containerInfo, String previousHostname, String currentHostname ) + public void onContainerHostnameChanged( ContainerHostInfo containerInfo, String previousHostname, + String currentHostname ) { } @@ -41,18 +41,7 @@ public void onContainerCreated( ContainerHostInfo containerInfo ) } - public void onContainerNetInterfaceChanged( ContainerHostInfo containerInfo, HostInterfaceModel oldNetInterface, - HostInterfaceModel newNetInterface ) - { - } - - - public void onContainerNetInterfaceAdded( ContainerHostInfo containerInfo, HostInterfaceModel netInterface ) - { - } - - - public void onContainerNetInterfaceRemoved( ContainerHostInfo containerInfo, HostInterfaceModel netInterface ) + public void onContainerDestroyed( ContainerHostInfo containerInfo ) { } diff --git a/management/server/core/host-registry/host-registry-impl/src/main/java/io/subutai/core/hostregistry/impl/HostNotifier.java b/management/server/core/host-registry/host-registry-impl/src/main/java/io/subutai/core/hostregistry/impl/HostNotifier.java index b74ff1481df..ff892394613 100644 --- a/management/server/core/host-registry/host-registry-impl/src/main/java/io/subutai/core/hostregistry/impl/HostNotifier.java +++ b/management/server/core/host-registry/host-registry-impl/src/main/java/io/subutai/core/hostregistry/impl/HostNotifier.java @@ -7,9 +7,13 @@ import org.slf4j.LoggerFactory; import io.subutai.common.host.ContainerHostInfo; -import io.subutai.common.host.HostInterfaceModel; import io.subutai.common.host.ResourceHostInfo; import io.subutai.common.metric.QuotaAlertValue; +import io.subutai.common.peer.HostNotFoundException; +import io.subutai.common.peer.LocalPeer; +import io.subutai.common.peer.ResourceHost; +import io.subutai.common.peer.ResourceHostException; +import io.subutai.common.util.ServiceLocator; import io.subutai.core.hostregistry.api.HostListener; @@ -134,88 +138,78 @@ private void processHeartbeat( ResourceHostInfo oldRhInfo, ResourceHostInfo newR } } - // 3. check if container interfaces have been changed/added - for ( final HostInterfaceModel newNetInterface : newContainerInfo.getHostInterfaces().getAll() ) - { - boolean interfaceExistedBefore = false; - for ( final HostInterfaceModel oldNetInterface : oldContainerInfo.getHostInterfaces().getAll() ) - { - if ( newNetInterface.getName().equalsIgnoreCase( oldNetInterface.getName() ) ) - { - if ( !newNetInterface.getIp().equals( oldNetInterface.getIp() ) ) - { - try - { - listener.onContainerNetInterfaceChanged( newContainerInfo, oldNetInterface, - newNetInterface ); - } - catch ( Exception e ) - { - LOG.warn( ERR_MSG_TEMPLATE, e.getMessage() ); - } - } - - interfaceExistedBefore = true; + containerExistedBefore = true; - break; - } - } + break; + } + } - if ( !interfaceExistedBefore ) - { - try - { - listener.onContainerNetInterfaceAdded( newContainerInfo, newNetInterface ); - } - catch ( Exception e ) - { - LOG.warn( ERR_MSG_TEMPLATE, e.getMessage() ); - } - } - } + // 3. notify that container has been created + if ( !containerExistedBefore ) + { + try + { + listener.onContainerCreated( newContainerInfo ); + } + catch ( Exception e ) + { + LOG.warn( ERR_MSG_TEMPLATE, e.getMessage() ); + } + } + } - // 4. check if net interfaces have been removed - for ( final HostInterfaceModel oldNetInterface : oldContainerInfo.getHostInterfaces().getAll() ) - { - boolean interfaceStillExists = false; + // 4. check if container has been destroyed + for ( final ContainerHostInfo oldContainerInfo : oldRhInfo.getContainers() ) + { + boolean containerStillExists = false; - for ( HostInterfaceModel newNetInterface : newContainerInfo.getHostInterfaces().getAll() ) - { - if ( oldNetInterface.getName().equalsIgnoreCase( newNetInterface.getName() ) ) - { - interfaceStillExists = true; + for ( final ContainerHostInfo newContainerInfo : newRhInfo.getContainers() ) + { + if ( oldContainerInfo.getId().equalsIgnoreCase( newContainerInfo.getId() ) ) + { + containerStillExists = true; - break; - } - } + break; + } + } - if ( !interfaceStillExists ) + //check on RH once more to make sure + if ( !containerStillExists ) + { + LocalPeer localPeer = ServiceLocator.lookup( LocalPeer.class ); + try + { + ResourceHost resourceHost = localPeer.getResourceHostByContainerId( oldContainerInfo.getId() ); + + try + { + for ( String name : resourceHost.listExistingContainerNames() ) { - try + if ( oldContainerInfo.getContainerName().equalsIgnoreCase( name ) ) { - listener.onContainerNetInterfaceRemoved( newContainerInfo, oldNetInterface ); - } - catch ( Exception e ) - { - LOG.warn( ERR_MSG_TEMPLATE, e.getMessage() ); + containerStillExists = true; + break; } } } - - - containerExistedBefore = true; - - break; + catch ( ResourceHostException e ) + { + //just in case skip container removal in this round since we can not check + containerStillExists = true; + } + } + catch ( HostNotFoundException ignore ) + { + //no-op } } - // 5. notify that container has been created - if ( !containerExistedBefore ) + if ( !containerStillExists ) { try { - listener.onContainerCreated( newContainerInfo ); + listener.onContainerDestroyed( oldContainerInfo ); } catch ( Exception e ) { @@ -223,34 +217,5 @@ private void processHeartbeat( ResourceHostInfo oldRhInfo, ResourceHostInfo newR } } } - - //disabled due to https://github.com/subutai-io/base/issues/1735 - // // 6. check if container has been destroyed - // for ( final ContainerHostInfo oldContainerInfo : oldRhInfo.getContainers() ) - // { - // boolean containerStillExists = false; - // - // for ( final ContainerHostInfo newContainerInfo : newRhInfo.getContainers() ) - // { - // if ( oldContainerInfo.getId().equalsIgnoreCase( newContainerInfo.getId() ) ) - // { - // containerStillExists = true; - // - // break; - // } - // } - // - // if ( !containerStillExists ) - // { - // try - // { - // listener.onContainerDestroyed( oldContainerInfo ); - // } - // catch ( Exception e ) - // { - // LOG.warn( ERR_MSG_TEMPLATE, e.getMessage() ); - // } - // } - // } } } diff --git a/management/server/core/identity-manager/identity-manager-api/src/main/java/io/subutai/core/identity/api/IdentityManager.java b/management/server/core/identity-manager/identity-manager-api/src/main/java/io/subutai/core/identity/api/IdentityManager.java index e4eafa649ec..7f8b1ac6240 100644 --- a/management/server/core/identity-manager/identity-manager-api/src/main/java/io/subutai/core/identity/api/IdentityManager.java +++ b/management/server/core/identity-manager/identity-manager-api/src/main/java/io/subutai/core/identity/api/IdentityManager.java @@ -10,6 +10,7 @@ import org.apache.cxf.message.Message; +import io.subutai.common.host.SubutaiOrigin; import io.subutai.common.security.exception.SystemSecurityException; import io.subutai.common.security.objects.PermissionObject; import io.subutai.common.security.objects.PermissionOperation; @@ -42,6 +43,7 @@ public interface IdentityManager String ENV_MANAGER_ROLE = "Environment-Manager"; String TEMPLATE_MANAGER_ROLE = "Template-Manager"; + String SUBUTAI_ORIGIN_HEADER_KEY = "subutaiOrigin"; // String ENV_OWNER_ROLE = "Environment-Owner"; @@ -336,7 +338,7 @@ boolean isUserPermitted( User user, PermissionObject permObj, PermissionScope pe Session loginSystemUser(); - String issueJWTToken( final String origin ) throws TokenCreateException; + String issueJWTToken( final SubutaiOrigin origin ) throws TokenCreateException; boolean verifyJWTToken( final String token ) throws TokenParseException; diff --git a/management/server/core/identity-manager/identity-manager-impl/src/main/java/io/subutai/core/identity/impl/IdentityManagerImpl.java b/management/server/core/identity-manager/identity-manager-impl/src/main/java/io/subutai/core/identity/impl/IdentityManagerImpl.java index b67f26c18ac..41a63fe170e 100644 --- a/management/server/core/identity-manager/identity-manager-impl/src/main/java/io/subutai/core/identity/impl/IdentityManagerImpl.java +++ b/management/server/core/identity-manager/identity-manager-impl/src/main/java/io/subutai/core/identity/impl/IdentityManagerImpl.java @@ -46,6 +46,7 @@ import com.google.common.cache.CacheBuilder; import io.subutai.common.dao.DaoManager; +import io.subutai.common.host.SubutaiOrigin; import io.subutai.common.security.crypto.pgp.KeyPair; import io.subutai.common.security.exception.IdentityExpiredException; import io.subutai.common.security.exception.InvalidLoginException; @@ -333,7 +334,7 @@ public Session login( HttpServletRequest request, Message message ) } Map> headers = ( Map> ) message.get( Message.PROTOCOL_HEADERS ); - headers.put( "subutaiOrigin", Arrays.asList( token.getSubject() ) ); + headers.put( SUBUTAI_ORIGIN_HEADER_KEY, Arrays.asList( token.getSubject() ) ); message.put( Message.PROTOCOL_HEADERS, headers ); @@ -360,23 +361,23 @@ private String getBearerToken( HttpServletRequest request ) @Override - public String issueJWTToken( String origin ) throws TokenCreateException + public String issueJWTToken( SubutaiOrigin origin ) throws TokenCreateException { final String secret = UUID.randomUUID().toString(); DateTime issueDate = DateTime.now(); DateTime expireDate = issueDate.plusSeconds( JWT_TOKEN_EXPIRATION_TIME ); String token = - new TokenHelperImpl( TOKEN_ISSUER, origin, issueDate.toDate(), expireDate.toDate(), secret ).getToken(); + new TokenHelperImpl( TOKEN_ISSUER, origin.toString(), issueDate.toDate(), expireDate.toDate(), secret ) + .getToken(); - this.jwtTokenCache.put( origin, secret ); + this.jwtTokenCache.put( origin.toString(), secret ); return token; } @Override public boolean verifyJWTToken( String token ) throws TokenParseException - { final TokenHelperImpl signedToken = new TokenHelperImpl( token ); if ( signedToken.getExpirationTime().before( new Date() ) ) @@ -1800,6 +1801,11 @@ public boolean isUserPermitted( User user, PermissionObject permObj, PermissionS return false; } + if ( user.getType() == UserType.SYSTEM.getId() ) + { + return true; + } + List roles = user.getRoles(); for ( Role role : roles ) diff --git a/management/server/core/pom.xml b/management/server/core/pom.xml index 4ad81d942ef..be8458fed87 100644 --- a/management/server/core/pom.xml +++ b/management/server/core/pom.xml @@ -30,6 +30,7 @@ security-manager host-registration environment-manager + environment-metadata-manager test object-relation-manager system-manager diff --git a/management/server/server-karaf/build.gradle b/management/server/server-karaf/build.gradle index 2a8b1989476..23707c24b95 100644 --- a/management/server/server-karaf/build.gradle +++ b/management/server/server-karaf/build.gradle @@ -19,6 +19,9 @@ dependencies { subutai project( ':management:server:core:environment-manager:environment-manager-impl') subutai project( ':management:server:core:environment-manager:environment-manager-rest') subutai project( ':management:server:core:environment-manager:environment-manager-rest-ui') + subutai project( ':management:server:core:environment-manager:environment-metadata-manager-api') + subutai project( ':management:server:core:environment-manager:environment-metadata-manager-impl') + subutai project( ':management:server:core:environment-manager:environment-metadata-manager-rest') subutai project( ':management:server:core:host-registration:host-registration-api') subutai project( ':management:server:core:host-registration:host-registration-cli') subutai project( ':management:server:core:host-registration:host-registration-impl') diff --git a/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/Utils.java b/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/Utils.java deleted file mode 100644 index a19234bea69..00000000000 --- a/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/Utils.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.subutai.bazaar.share; - - -public class Utils -{ - public static String buildSubutaiOrigin( final String environmentId, final String peerId, - final String containerId ) - { - return String.format( "%s.%s.%s", environmentId, peerId, containerId, environmentId ); - } -} diff --git a/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/common/BazaaarAdapter.java b/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/common/BazaaarAdapter.java index e20a1a0c00b..24b43c2064a 100644 --- a/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/common/BazaaarAdapter.java +++ b/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/common/BazaaarAdapter.java @@ -1,6 +1,10 @@ package io.subutai.bazaar.share.common; +import io.subutai.bazaar.share.event.EventMessage; +import io.subutai.bazaar.share.event.payload.Payload; + + public interface BazaaarAdapter { // @@ -27,4 +31,8 @@ public interface BazaaarAdapter void notifyContainerDiskUsageExcess( String peerId, String envId, String contId, long diskUsage, boolean containerWasStopped ); + + Payload getMetaData( final String environmentId, final String type ); + + void pushEvent( Payload message ); } diff --git a/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/event/meta/OriginMeta.java b/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/event/meta/OriginMeta.java index 62476fea6af..d9190986d15 100644 --- a/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/event/meta/OriginMeta.java +++ b/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/event/meta/OriginMeta.java @@ -2,11 +2,12 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; -import io.subutai.bazaar.share.Utils; +import static java.lang.String.format; @JsonAutoDetect( fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, @@ -23,11 +24,11 @@ public class OriginMeta implements Meta @JsonProperty private String environmentId; - + @JsonCreator public OriginMeta( final String subutaiOrigin ) { Preconditions.checkNotNull( subutaiOrigin ); - final String[] parts = subutaiOrigin.split( "\\." ); + final String[] parts = subutaiOrigin.split( ":" ); if ( parts.length != 3 ) { throw new IllegalArgumentException( "Invalid origin argument." ); @@ -45,7 +46,7 @@ private OriginMeta() public String getId() { - return Utils.buildSubutaiOrigin( this.environmentId, this.peerId, this.containerId ); + return format( "%s:%s:%s", this.environmentId, this.peerId, this.containerId ); } diff --git a/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/event/payload/CustomPayload.java b/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/event/payload/CustomPayload.java index 14418bd0842..67d0135544a 100644 --- a/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/event/payload/CustomPayload.java +++ b/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/event/payload/CustomPayload.java @@ -31,6 +31,6 @@ public String getMessage() @Override public String toString() { - return "StringPayload{" + "message='" + message + '\'' + '}'; + return "CustomPayload{" + "message='" + message + '\'' + '}'; } } diff --git a/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/event/payload/Payload.java b/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/event/payload/Payload.java index 2ebb1dd9a45..2693e511459 100644 --- a/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/event/payload/Payload.java +++ b/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/event/payload/Payload.java @@ -7,7 +7,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; -@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type" ) +@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, property = "type" ) @JsonSubTypes( { @JsonSubTypes.Type( value = CustomPayload.class, name = "custom" ), @JsonSubTypes.Type( value = LogPayload.class, name = "log" ), @@ -18,8 +18,4 @@ @JsonIgnoreProperties( ignoreUnknown = true ) abstract public class Payload { - public enum Nature - { - CUSTOM, LOG, PROGRESS - } } diff --git a/management/server/subutai-bazaar-share/src/test/java/io/subutai/bazaar/share/event/EventMessageTest.java b/management/server/subutai-bazaar-share/src/test/java/io/subutai/bazaar/share/event/EventMessageTest.java index 0130aa1fd6c..67321e0d40c 100644 --- a/management/server/subutai-bazaar-share/src/test/java/io/subutai/bazaar/share/event/EventMessageTest.java +++ b/management/server/subutai-bazaar-share/src/test/java/io/subutai/bazaar/share/event/EventMessageTest.java @@ -38,7 +38,7 @@ public void setup() logPayload = new LogPayload("source", "initiated", LogPayload.Level.INFO); - origin = new OriginMeta( "subutaiPeer.subutaiContainer.subutaiEnvironment" ); + origin = new OriginMeta( "subutaiPeer:subutaiContainer:subutaiEnvironment" ); source = new SourceMeta( "cassandra-blueprint", SourceMeta.Type.BLUEPRINT ); } diff --git a/management/server/subutai-common/src/main/java/io/subutai/common/host/SubutaiOrigin.java b/management/server/subutai-common/src/main/java/io/subutai/common/host/SubutaiOrigin.java new file mode 100644 index 00000000000..e01ce19c9d3 --- /dev/null +++ b/management/server/subutai-common/src/main/java/io/subutai/common/host/SubutaiOrigin.java @@ -0,0 +1,67 @@ +package io.subutai.common.host; + + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.google.common.base.Preconditions; + +import static java.lang.String.format; + + +public class SubutaiOrigin +{ + private static final String UNDNEFINED = "undefined"; + private String environmentId; + private String peerId; + private String containerId; + + + @JsonCreator + public SubutaiOrigin( final String origin ) + { + Preconditions.checkNotNull( origin ); + + final String[] parts = origin.split( ":" ); + + if ( parts.length != 3 ) + { + throw new IllegalArgumentException( "Invalid subutai origin" ); + } + + this.environmentId = parts[0]; + this.peerId = parts[1]; + this.containerId = parts[2]; + } + + + public SubutaiOrigin( final String environmentId, final String peerId, final String containerId ) + { + this.environmentId = environmentId == null ? UNDNEFINED : environmentId; + this.peerId = peerId == null ? UNDNEFINED : peerId; + this.containerId = containerId == null ? UNDNEFINED : containerId; + } + + + public String getEnvironmentId() + { + return environmentId; + } + + + public String getPeerId() + { + return peerId; + } + + + public String getContainerId() + { + return containerId; + } + + + @Override + public String toString() + { + return format( "%s:%s:%s", environmentId, peerId, containerId ); + } +} diff --git a/management/server/subutai-features/pom.xml b/management/server/subutai-features/pom.xml index 2fa547a4a00..3f23294cadb 100644 --- a/management/server/subutai-features/pom.xml +++ b/management/server/subutai-features/pom.xml @@ -155,6 +155,20 @@ ${project.groupId} environment-manager-rest-ui + + + + ${project.groupId} + environment-metadata-manager-api + + + ${project.groupId} + environment-metadata-manager-impl + + + ${project.groupId} + environment-metadata-manager-rest +