From 8246c450d2d64bedead928a95f69e29c6216f495 Mon Sep 17 00:00:00 2001 From: "tjamakeev@optimal-dynamics.com" Date: Fri, 28 Dec 2018 15:25:15 +0600 Subject: [PATCH 1/6] #2379 - initial version of environment metadata manager --- management/pom.xml | 19 ++++++ .../core/identity/api/IdentityManager.java | 4 +- .../identity/impl/IdentityManagerImpl.java | 16 +++-- management/server/core/pom.xml | 1 + management/server/server-karaf/build.gradle | 3 + .../java/io/subutai/bazaar/share/Utils.java | 11 --- .../bazaar/share/event/meta/OriginMeta.java | 4 +- .../io/subutai/bazaar/share/events/Event.java | 6 ++ .../bazaar/share/events/ProgressEvent.java | 61 +++++++++++++++++ .../io/subutai/common/host/SubutaiOrigin.java | 67 +++++++++++++++++++ management/server/subutai-features/pom.xml | 14 ++++ 11 files changed, 187 insertions(+), 19 deletions(-) delete mode 100644 management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/Utils.java create mode 100644 management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/events/Event.java create mode 100644 management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/events/ProgressEvent.java create mode 100644 management/server/subutai-common/src/main/java/io/subutai/common/host/SubutaiOrigin.java 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/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/event/meta/OriginMeta.java b/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/event/meta/OriginMeta.java index 62476fea6af..d47c1378dc4 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 @@ -6,7 +6,7 @@ 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, @@ -45,7 +45,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/events/Event.java b/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/events/Event.java new file mode 100644 index 00000000000..13291b7e80a --- /dev/null +++ b/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/events/Event.java @@ -0,0 +1,6 @@ +package io.subutai.bazaar.share.events; + + +public interface Event +{ +} diff --git a/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/events/ProgressEvent.java b/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/events/ProgressEvent.java new file mode 100644 index 00000000000..0801304bd21 --- /dev/null +++ b/management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/events/ProgressEvent.java @@ -0,0 +1,61 @@ +package io.subutai.bazaar.share.events; + + +public class ProgressEvent +{ + private String process; + + private String step; + + private String message; + + private double value; + + + public String getProcess() + { + return process; + } + + + public void setProcess( final String process ) + { + this.process = process; + } + + + public String getStep() + { + return step; + } + + + public void setStep( final String step ) + { + this.step = step; + } + + + public String getMessage() + { + return message; + } + + + public void setMessage( final String message ) + { + this.message = message; + } + + + public double getValue() + { + return value; + } + + + public void setValue( final double value ) + { + this.value = value; + } +} 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 + From 466ad0bc0adc0025cb82e3c0343e12f57582d26a Mon Sep 17 00:00:00 2001 From: "tjamakeev@optimal-dynamics.com" Date: Fri, 28 Dec 2018 15:42:07 +0600 Subject: [PATCH 2/6] #2379 - initial version of environment metadata manager --- .../environment-metadata-manager-api/pom.xml | 50 ++++++++ .../api/EnvironmentMetadataManager.java | 24 ++++ .../environment-metadata-manager-impl/pom.xml | 85 ++++++++++++++ .../impl/EnvironmentMetadataManagerImpl.java | 107 ++++++++++++++++++ .../resources/OSGI-INF/blueprint/context.xml | 28 +++++ .../EnvironmentMetadataManagerImplTest.java | 31 +++++ .../environment-metadata-manager-rest/pom.xml | 75 ++++++++++++ .../metadata/rest/RestService.java | 42 +++++++ .../metadata/rest/RestServiceImpl.java | 67 +++++++++++ .../resources/OSGI-INF/blueprint/context.xml | 5 + .../resources/OSGI-INF/blueprint/rest.xml | 31 +++++ .../core/environment-metadata-manager/pom.xml | 23 ++++ 12 files changed, 568 insertions(+) create mode 100644 management/server/core/environment-metadata-manager/environment-metadata-manager-api/pom.xml create mode 100644 management/server/core/environment-metadata-manager/environment-metadata-manager-api/src/main/java/io/subutai/core/environment/metadata/api/EnvironmentMetadataManager.java create mode 100644 management/server/core/environment-metadata-manager/environment-metadata-manager-impl/pom.xml create mode 100644 management/server/core/environment-metadata-manager/environment-metadata-manager-impl/src/main/java/io/subutai/core/environment/metadata/impl/EnvironmentMetadataManagerImpl.java create mode 100644 management/server/core/environment-metadata-manager/environment-metadata-manager-impl/src/main/resources/OSGI-INF/blueprint/context.xml create mode 100644 management/server/core/environment-metadata-manager/environment-metadata-manager-impl/src/test/java/io/subutai/core/environment/metadata/impl/EnvironmentMetadataManagerImplTest.java create mode 100644 management/server/core/environment-metadata-manager/environment-metadata-manager-rest/pom.xml create mode 100644 management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/java/io/subutai/core/environment/metadata/rest/RestService.java create mode 100644 management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/java/io/subutai/core/environment/metadata/rest/RestServiceImpl.java create mode 100644 management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/resources/OSGI-INF/blueprint/context.xml create mode 100644 management/server/core/environment-metadata-manager/environment-metadata-manager-rest/src/main/resources/OSGI-INF/blueprint/rest.xml create mode 100644 management/server/core/environment-metadata-manager/pom.xml 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..57f4c55df98 --- /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,24 @@ +package io.subutai.core.environment.metadata.api; + + +import io.subutai.bazaar.share.dto.environment.EnvironmentInfoDto; +import io.subutai.bazaar.share.events.Event; +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; + + EnvironmentInfoDto getEnvironmentInfoDto( String environmentId ); + + void pushEvent( Event event ); +} 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..65d06e0e535 --- /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,107 @@ +package io.subutai.core.environment.metadata.impl; + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.subutai.bazaar.share.dto.environment.EnvironmentInfoDto; +import io.subutai.bazaar.share.events.Event; +import io.subutai.common.command.CommandException; +import io.subutai.common.command.RequestBuilder; +import io.subutai.common.environment.Environment; +import io.subutai.common.environment.EnvironmentNotFoundException; +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; + + + public EnvironmentMetadataManagerImpl( PeerManager peerManager, EnvironmentManager environmentManager, + IdentityManager identityManager ) + { + this.peerManager = peerManager; + this.environmentManager = environmentManager; + this.identityManager = identityManager; + } + + + @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 EnvironmentInfoDto getEnvironmentInfoDto( final String environmentId ) + { + final EnvironmentInfoDto result = new EnvironmentInfoDto(); + try + { + Environment environment = environmentManager.loadEnvironment( environmentId ); + result.setName( environment.getName() ); + result.setSubnetCidr( environment.getSubnetCidr() ); + } + catch ( EnvironmentNotFoundException e ) + { + // ignore + } + return result; + } + + + @Override + public void pushEvent( final Event event ) + { + LOG.debug( "Event received: {}", event ); + } + + + 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..6ae1ff8d403 --- /dev/null +++ b/management/server/core/environment-metadata-manager/environment-metadata-manager-impl/src/main/resources/OSGI-INF/blueprint/context.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + 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..72eef0fad90 --- /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,42 @@ +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.events.Event; +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" ) + @Produces( MediaType.APPLICATION_JSON ) + @GET + Response getEnvironmentDto( @HeaderParam( IdentityManager.SUBUTAI_ORIGIN_HEADER_KEY ) SubutaiOrigin origin ); + + @Path( "/event" ) + @Consumes( MediaType.APPLICATION_JSON ) + @POST + Response pushEvent( @HeaderParam( IdentityManager.SUBUTAI_ORIGIN_HEADER_KEY ) SubutaiOrigin origin, Event event ); +} 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..6c1b2be01bb --- /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,67 @@ +package io.subutai.core.environment.metadata.rest; + + +import javax.ws.rs.core.Response; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.subutai.bazaar.share.dto.environment.EnvironmentInfoDto; +import io.subutai.bazaar.share.events.Event; +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 ) + { + EnvironmentInfoDto environmentInfoDto = + environmentMetadataManager.getEnvironmentInfoDto( origin.getEnvironmentId() ); + return Response.ok( environmentInfoDto ).build(); + } + + + @Override + public Response pushEvent( final SubutaiOrigin origin, final Event event ) + { + environmentMetadataManager.pushEvent( event ); + 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 From 1a19de00a0854540d0ae77c1c909e07ad059d5f4 Mon Sep 17 00:00:00 2001 From: "tjamakeev@optimal-dynamics.com" Date: Sat, 29 Dec 2018 14:25:39 +0600 Subject: [PATCH 3/6] #2379 - event pushing - metadata request by type --- .../impl/adapter/BazaaarAdapterImpl.java | 36 ++++++++++- .../api/EnvironmentMetadataManager.java | 7 +-- .../impl/EnvironmentMetadataManagerImpl.java | 30 +++------ .../resources/OSGI-INF/blueprint/context.xml | 4 ++ .../metadata/rest/RestService.java | 9 +-- .../metadata/rest/RestServiceImpl.java | 12 ++-- .../bazaar/share/common/BazaaarAdapter.java | 8 +++ .../bazaar/share/event/meta/OriginMeta.java | 5 +- .../share/event/payload/CustomPayload.java | 2 +- .../bazaar/share/event/payload/Payload.java | 6 +- .../io/subutai/bazaar/share/events/Event.java | 6 -- .../bazaar/share/events/ProgressEvent.java | 61 ------------------- .../bazaar/share/event/EventMessageTest.java | 2 +- 13 files changed, 74 insertions(+), 114 deletions(-) delete mode 100644 management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/events/Event.java delete mode 100644 management/server/subutai-bazaar-share/src/main/java/io/subutai/bazaar/share/events/ProgressEvent.java 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-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 index 57f4c55df98..0ccbddfbbdc 100644 --- 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 @@ -1,8 +1,7 @@ package io.subutai.core.environment.metadata.api; -import io.subutai.bazaar.share.dto.environment.EnvironmentInfoDto; -import io.subutai.bazaar.share.events.Event; +import io.subutai.bazaar.share.event.payload.Payload; import io.subutai.core.identity.api.exception.TokenCreateException; @@ -18,7 +17,7 @@ public interface EnvironmentMetadataManager void issueToken( String containerIp ) throws TokenCreateException; - EnvironmentInfoDto getEnvironmentInfoDto( String environmentId ); + Payload getEnvironmentInfoDto( String environmentId, String type ); - void pushEvent( Event event ); + void pushEvent( Payload eventMessage ); } 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 index 65d06e0e535..322d617ea7e 100644 --- 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 @@ -4,12 +4,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import io.subutai.bazaar.share.dto.environment.EnvironmentInfoDto; -import io.subutai.bazaar.share.events.Event; +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.environment.Environment; -import io.subutai.common.environment.EnvironmentNotFoundException; import io.subutai.common.host.SubutaiOrigin; import io.subutai.common.peer.ContainerHost; import io.subutai.common.peer.HostNotFoundException; @@ -29,14 +27,16 @@ public class EnvironmentMetadataManagerImpl implements EnvironmentMetadataManage private final IdentityManager identityManager; private PeerManager peerManager; private EnvironmentManager environmentManager; + private BazaaarAdapter bazaarAdapter; public EnvironmentMetadataManagerImpl( PeerManager peerManager, EnvironmentManager environmentManager, - IdentityManager identityManager ) + IdentityManager identityManager, BazaaarAdapter bazaaarAdapter ) { this.peerManager = peerManager; this.environmentManager = environmentManager; this.identityManager = identityManager; + this.bazaarAdapter = bazaaarAdapter; } @@ -74,27 +74,17 @@ public void issueToken( String containerIp ) throws TokenCreateException @Override - public EnvironmentInfoDto getEnvironmentInfoDto( final String environmentId ) + public Payload getEnvironmentInfoDto( final String environmentId, final String type ) { - final EnvironmentInfoDto result = new EnvironmentInfoDto(); - try - { - Environment environment = environmentManager.loadEnvironment( environmentId ); - result.setName( environment.getName() ); - result.setSubnetCidr( environment.getSubnetCidr() ); - } - catch ( EnvironmentNotFoundException e ) - { - // ignore - } - return result; + return bazaarAdapter.getMetaData( environmentId, type ); } @Override - public void pushEvent( final Event event ) + public void pushEvent( final Payload eventMessage ) { - LOG.debug( "Event received: {}", event ); + LOG.debug( "Event received: {}", eventMessage ); + bazaarAdapter.pushEvent( eventMessage ); } 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 index 6ae1ff8d403..86f51e9106b 100644 --- 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 @@ -16,11 +16,15 @@ + + + Date: Sat, 29 Dec 2018 17:45:48 +0600 Subject: [PATCH 4/6] #2769 added container destruction event --- .../impl/EnvironmentManagerSecureProxy.java | 26 --- .../core/hostregistry/api/HostListener.java | 19 +-- .../core/hostregistry/impl/HostNotifier.java | 153 +++++++----------- 3 files changed, 63 insertions(+), 135 deletions(-) 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..dff77a31b8d 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; @@ -801,31 +800,6 @@ public void onContainerCreated( final ContainerHostInfo containerInfo ) } - @Override - public void onContainerNetInterfaceChanged( final ContainerHostInfo containerInfo, - final HostInterfaceModel oldNetInterface, - final HostInterfaceModel newNetInterface ) - { - 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 ); - } - - @Override public void onRhConnected( final ResourceHostInfo resourceHostInfo ) { 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() ); - // } - // } - // } } } From ddf692ecb8d31ad03043a96ab2647a1727f9e97c Mon Sep 17 00:00:00 2001 From: Dilshat Aliev Date: Sat, 29 Dec 2018 18:58:34 +0600 Subject: [PATCH 5/6] #2769 added handler for container destruction event --- .../environment/impl/EnvironmentManagerImpl.java | 15 +++++++++++++++ .../impl/EnvironmentManagerSecureProxy.java | 7 +++++++ 2 files changed, 22 insertions(+) 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 dff77a31b8d..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 @@ -800,6 +800,13 @@ public void onContainerCreated( final ContainerHostInfo containerInfo ) } + @Override + public void onContainerDestroyed( final ContainerHostInfo containerInfo ) + { + environmentManager.onContainerDestroyed( containerInfo ); + } + + @Override public void onRhConnected( final ResourceHostInfo resourceHostInfo ) { From 996b7e931c454af2ac1947e866edc7866a39b930 Mon Sep 17 00:00:00 2001 From: "tjamakeev@optimal-dynamics.com" Date: Wed, 2 Jan 2019 14:12:06 +0600 Subject: [PATCH 6/6] #2379 - improvement of metadata request by type: support custom payload --- .../metadata/rest/RestServiceImpl.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) 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 index 0a5e947a960..60e24b9e92b 100644 --- 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 @@ -1,12 +1,18 @@ 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; @@ -51,8 +57,25 @@ public Response echo( final String containerId, String message ) @Override public Response getEnvironmentDto( final SubutaiOrigin origin, final String type ) { - Payload environmentInfoDto = environmentMetadataManager.getEnvironmentInfoDto( origin.getEnvironmentId(), type ); - return Response.ok( environmentInfoDto ).build(); + 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(); + } }