From 89d6dc66aaff5555092483844c1b86942d0aadd2 Mon Sep 17 00:00:00 2001 From: Timur Zhamakeev Date: Sat, 7 Apr 2018 18:41:34 +0600 Subject: [PATCH] #2379 implemented initial version of the event publishing from container --- .../interceptor/AccessControlInterceptor.java | 11 ++- .../environment/api/EnvironmentManager.java | 2 + .../impl/EnvironmentManagerImpl.java | 7 ++ .../impl/EnvironmentManagerSecureProxy.java | 7 ++ .../api/EnvironmentMetadataManager.java | 10 ++ .../impl/EnvironmentMetadataManagerImpl.java | 37 +++++++- .../metadata/rest/RestService.java | 19 +++- .../metadata/rest/RestServiceImpl.java | 28 +++++- .../core/identity/api/IdentityManager.java | 15 ++- .../core/identity/api/TokenHelper.java | 18 ++++ .../identity/impl/IdentityManagerImpl.java | 56 +++++++++-- ...{TokenHelper.java => TokenHelperImpl.java} | 42 +++------ .../io/subutai/hub/share/event/Event.java | 24 +++++ .../subutai/hub/share/event/EventMessage.java | 91 ++++++++++++++++++ .../io/subutai/hub/share/event/MetaData.java | 88 +++++++++++++++++ .../hub/share/event/meta/CustomMeta.java | 39 ++++++++ .../io/subutai/hub/share/event/meta/Meta.java | 20 ++++ .../hub/share/event/meta/OriginMeta.java | 81 ++++++++++++++++ .../hub/share/event/meta/SourceMeta.java | 50 ++++++++++ .../hub/share/event/meta/TraceMeta.java | 45 +++++++++ .../share/event/payload/CustomPayload.java | 42 +++++++++ .../hub/share/event/payload/LogPayload.java | 94 +++++++++++++++++++ .../hub/share/event/payload/Payload.java | 26 +++++ .../share/event/payload/ProgressPayload.java | 89 ++++++++++++++++++ .../hub/share/event/EventMessageTest.java | 92 ++++++++++++++++++ .../hub/share/event/ObjectMapperTest.java | 19 ++++ 26 files changed, 1003 insertions(+), 49 deletions(-) create mode 100644 management/server/core/identity-manager/identity-manager-api/src/main/java/io/subutai/core/identity/api/TokenHelper.java rename management/server/core/identity-manager/identity-manager-impl/src/main/java/io/subutai/core/identity/impl/utils/{TokenHelper.java => TokenHelperImpl.java} (66%) create mode 100644 management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/Event.java create mode 100644 management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/EventMessage.java create mode 100644 management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/MetaData.java create mode 100644 management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/CustomMeta.java create mode 100644 management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/Meta.java create mode 100644 management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/OriginMeta.java create mode 100644 management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/SourceMeta.java create mode 100644 management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/TraceMeta.java create mode 100644 management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/CustomPayload.java create mode 100644 management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/LogPayload.java create mode 100644 management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/Payload.java create mode 100644 management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/ProgressPayload.java create mode 100644 management/server/subutai-hub-share/src/test/java/io/subutai/hub/share/event/EventMessageTest.java create mode 100644 management/server/subutai-hub-share/src/test/java/io/subutai/hub/share/event/ObjectMapperTest.java diff --git a/management/server/core/channel-manager/channel-manager-impl/src/main/java/io/subutai/core/channel/impl/interceptor/AccessControlInterceptor.java b/management/server/core/channel-manager/channel-manager-impl/src/main/java/io/subutai/core/channel/impl/interceptor/AccessControlInterceptor.java index d62b23e1478..16ec20dd8b2 100644 --- a/management/server/core/channel-manager/channel-manager-impl/src/main/java/io/subutai/core/channel/impl/interceptor/AccessControlInterceptor.java +++ b/management/server/core/channel-manager/channel-manager-impl/src/main/java/io/subutai/core/channel/impl/interceptor/AccessControlInterceptor.java @@ -110,7 +110,7 @@ private Session getSession( final Message message, final HttpServletRequest req //****************************************************************** - protected Session authenticateAccess( Message message, HttpServletRequest req ) + protected Session authenticateAccess( Message message, HttpServletRequest request ) { String sptoken; @@ -121,14 +121,14 @@ protected Session authenticateAccess( Message message, HttpServletRequest req ) } else { - String bearerToken = getBearerToken( req ); + String bearerToken = getBearerToken( request ); if ( bearerToken != null ) { - return identityManager.login( bearerToken ); + return identityManager.login( request, message ); } else { - sptoken = req.getParameter( "sptoken" ); + sptoken = request.getParameter( "sptoken" ); if ( Strings.isNullOrEmpty( sptoken ) ) { @@ -140,7 +140,7 @@ protected Session authenticateAccess( Message message, HttpServletRequest req ) if ( Strings.isNullOrEmpty( sptoken ) ) { - Cookie[] cookies = req.getCookies(); + Cookie[] cookies = request.getCookies(); for ( final Cookie cookie : cookies ) { if ( "sptoken".equals( cookie.getName() ) ) @@ -161,6 +161,7 @@ protected Session authenticateAccess( Message message, HttpServletRequest req ) } } } + //****************************************************************** diff --git a/management/server/core/environment-manager/environment-manager-api/src/main/java/io/subutai/core/environment/api/EnvironmentManager.java b/management/server/core/environment-manager/environment-manager-api/src/main/java/io/subutai/core/environment/api/EnvironmentManager.java index 411d0ff41bc..3f46317cc1b 100644 --- a/management/server/core/environment-manager/environment-manager-api/src/main/java/io/subutai/core/environment/api/EnvironmentManager.java +++ b/management/server/core/environment-manager/environment-manager-api/src/main/java/io/subutai/core/environment/api/EnvironmentManager.java @@ -285,6 +285,8 @@ void updateContainerHostname( final String environmentId, final String container void placeEnvironmentInfoByContainerId( String environmentId, String containerIp ) throws EnvironmentNotFoundException, ContainerHostNotFoundException, CommandException; + Environment getEnvironment( String environmentId ); + /** * Places JWT token to container * 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 1c32f1fb71d..dc3b36be21f 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 @@ -2756,6 +2756,13 @@ public void placeEnvironmentInfoByContainerIp( final String containerIp ) throws } + @Override + public Environment getEnvironment( String environmentId ) + { + return environmentService.find( environmentId ); + } + + @Override public void placeTokenToContainer( String environmentId, String containerIp, String token ) throws EnvironmentNotFoundException, ContainerHostNotFoundException, CommandException 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 69df1c6d73c..772dbd745e0 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 @@ -983,4 +983,11 @@ public void onContainerDestroyed( final ContainerHost containerHost ) { environmentManager.onContainerDestroyed( containerHost ); } + + + @Override + public Environment getEnvironment( final String environmentId ) + { + return environmentManager.getEnvironment( environmentId ); + } } 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 08d63456aff..37668d85a14 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 @@ -2,6 +2,8 @@ import io.subutai.core.identity.api.exception.TokenCreateException; +import io.subutai.hub.share.dto.environment.EnvironmentInfoDto; +import io.subutai.hub.share.event.Event; public interface EnvironmentMetadataManager @@ -15,4 +17,12 @@ public interface EnvironmentMetadataManager */ void issueToken( String containerIp ) throws TokenCreateException; + + EnvironmentInfoDto getEnvironmentInfoDto( String environmentId ); + + /*** + * Pushes event to consumers + * @param event @see Event + */ + void pushEvent( Event event ); } 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 e5e0576e142..5c16a86b090 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,7 +4,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.fasterxml.jackson.core.JsonProcessingException; + import io.subutai.common.command.CommandException; +import io.subutai.common.environment.Environment; import io.subutai.common.environment.EnvironmentNotFoundException; import io.subutai.common.peer.ContainerHost; import io.subutai.common.peer.HostNotFoundException; @@ -13,6 +16,9 @@ import io.subutai.core.identity.api.IdentityManager; import io.subutai.core.identity.api.exception.TokenCreateException; import io.subutai.core.peer.api.PeerManager; +import io.subutai.hub.share.dto.environment.EnvironmentInfoDto; +import io.subutai.hub.share.event.Event; +import io.subutai.hub.share.json.JsonUtil; /** @@ -54,7 +60,9 @@ public void issueToken( String containerIp ) throws TokenCreateException ContainerHost container = peerManager.getLocalPeer().getContainerHostByIp( containerIp ); String environmentId = container.getEnvironmentId().getId(); String containerId = container.getContainerId().getId(); - final String token = identityManager.issueJWTToken( environmentId, containerId ); + String peerId = container.getPeerId(); + String origin = String.format( "%s.%s.%s", peerId, containerId, environmentId ); + final String token = identityManager.issueJWTToken( origin ); environmentManager.placeTokenToContainer( environmentId, containerIp, token ); } catch ( HostNotFoundException | EnvironmentNotFoundException | CommandException e ) @@ -62,5 +70,32 @@ public void issueToken( String containerIp ) throws TokenCreateException throw new TokenCreateException( e.getMessage() ); } } + + + @Override + public EnvironmentInfoDto getEnvironmentInfoDto( final String environmentId ) + { + Environment environment = environmentManager.getEnvironment( environmentId ); + final EnvironmentInfoDto result = new EnvironmentInfoDto(); + result.setName( environment.getName() ); + result.setSubnetCidr( environment.getSubnetCidr() ); + return result; + } + + + @Override + public void pushEvent( final Event event ) + { + try + { + LOG.debug( "Event received: {} {}", event, JsonUtil.toJson( event ) ); + LOG.debug( "OS: {}", event.getCustomMetaByKey( "OS" ) ); + } + catch ( JsonProcessingException e ) + { + LOG.error( e.getMessage(), e ); + } + // TODO: send event to consumers + } } 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 index fa66acf495f..427e0237af7 100644 --- 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 @@ -1,11 +1,18 @@ 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.hub.share.event.EventMessage; + /** * REST endpoint for environment metadata manager @@ -19,5 +26,15 @@ public interface RestService @Path( "/echo/{message}" ) @GET - Response echo( @PathParam( "message" ) String message ); + Response echo( @HeaderParam( "containerId" ) String containerId, @PathParam( "message" ) String message ); + + @Path( "/info" ) + @Produces( MediaType.APPLICATION_JSON ) + @GET + Response getEnvironmentDto( @HeaderParam( "environmentId" ) String environmentId ); + + @Path( "/event" ) + @Consumes( MediaType.APPLICATION_JSON ) + @POST + Response pushEvent( @HeaderParam( "subutaiOrigin" ) String origin, EventMessage 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 index fab55dd92d5..2589b0d2765 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 @@ -8,6 +8,8 @@ import io.subutai.core.environment.metadata.api.EnvironmentMetadataManager; import io.subutai.core.identity.api.exception.TokenCreateException; +import io.subutai.hub.share.dto.environment.EnvironmentInfoDto; +import io.subutai.hub.share.event.EventMessage; public class RestServiceImpl implements RestService @@ -40,8 +42,30 @@ public Response issueToken( String containerIp ) @Override - public Response echo( String message ) + public Response echo( final String containerId, String message ) { - return Response.ok( message ).build(); + return Response.ok( String.format( "You are %s and your message is %s.", containerId, message ) ).build(); + } + + + @Override + public Response getEnvironmentDto( final String environmentId ) + { + EnvironmentInfoDto environmentInfoDto = environmentMetadataManager.getEnvironmentInfoDto( environmentId ); + return Response.ok( environmentInfoDto ).build(); + } + + + @Override + public Response pushEvent( final String subutaiOrigin, final EventMessage event ) + { + if ( event == null || !subutaiOrigin.equals( event.getOrigin().getId() ) ) + { + return Response.status( Response.Status.BAD_REQUEST ).build(); + } + + event.addTrace( "peer:" + event.getOrigin().getPeerId() ); + environmentMetadataManager.pushEvent( event ); + return Response.noContent().build(); } } 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 bcb7f509051..e4eafa649ec 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 @@ -6,6 +6,9 @@ import java.util.concurrent.Callable; import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletRequest; + +import org.apache.cxf.message.Message; import io.subutai.common.security.exception.SystemSecurityException; import io.subutai.common.security.objects.PermissionObject; @@ -46,14 +49,16 @@ public interface IdentityManager void destroy(); + TokenHelper buildTokenHelper( String token ) throws TokenParseException; + /** - * Bearer token login + * Token auth login * - * @param bearerToken bearer token + * @param request HttpServletRequest * * @return Session @see Session */ - Session login( String bearerToken ); + Session login( HttpServletRequest request, Message message ); /* ************************************************* */ @@ -331,9 +336,9 @@ boolean isUserPermitted( User user, PermissionObject permObj, PermissionScope pe Session loginSystemUser(); - String issueJWTToken( String environmentId, String containerId ) throws TokenCreateException; + String issueJWTToken( final String origin ) throws TokenCreateException; - boolean verifyJWTToken( String token ) throws TokenParseException; + boolean verifyJWTToken( final String token ) throws TokenParseException; /* ************************************************* * diff --git a/management/server/core/identity-manager/identity-manager-api/src/main/java/io/subutai/core/identity/api/TokenHelper.java b/management/server/core/identity-manager/identity-manager-api/src/main/java/io/subutai/core/identity/api/TokenHelper.java new file mode 100644 index 00000000000..cc685bca2b9 --- /dev/null +++ b/management/server/core/identity-manager/identity-manager-api/src/main/java/io/subutai/core/identity/api/TokenHelper.java @@ -0,0 +1,18 @@ +package io.subutai.core.identity.api; + + +import java.util.Date; + +import io.subutai.core.identity.api.exception.TokenParseException; + + +public interface TokenHelper +{ + String getToken(); + + boolean verify( String secret ); + + String getSubject() throws TokenParseException; + + Date getExpirationTime() 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 e3184f54443..29432438482 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 @@ -10,6 +10,7 @@ import java.security.NoSuchProviderException; import java.security.PrivilegedAction; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; @@ -27,6 +28,7 @@ import javax.security.auth.callback.PasswordCallback; import javax.security.auth.callback.UnsupportedCallbackException; import javax.security.auth.login.LoginContext; +import javax.servlet.http.HttpServletRequest; import org.bouncycastle.openpgp.PGPException; import org.bouncycastle.openpgp.PGPPublicKey; @@ -36,6 +38,7 @@ import org.slf4j.LoggerFactory; import org.apache.commons.lang.time.DateUtils; +import org.apache.cxf.message.Message; import com.google.common.base.Preconditions; import com.google.common.base.Strings; @@ -68,6 +71,7 @@ import io.subutai.core.identity.api.IdentityManager; import io.subutai.core.identity.api.SecurityController; import io.subutai.core.identity.api.SessionManager; +import io.subutai.core.identity.api.TokenHelper; import io.subutai.core.identity.api.dao.IdentityDataService; import io.subutai.core.identity.api.exception.TokenCreateException; import io.subutai.core.identity.api.exception.TokenParseException; @@ -86,7 +90,7 @@ import io.subutai.core.identity.impl.model.UserEntity; import io.subutai.core.identity.impl.model.UserTokenEntity; import io.subutai.core.identity.impl.utils.SecurityUtil; -import io.subutai.core.identity.impl.utils.TokenHelper; +import io.subutai.core.identity.impl.utils.TokenHelperImpl; import io.subutai.core.security.api.SecurityManager; import io.subutai.core.security.api.crypto.EncryptionTool; import io.subutai.core.security.api.crypto.KeyManager; @@ -163,6 +167,13 @@ public void destroy() } + @Override + public TokenHelper buildTokenHelper( final String token ) throws TokenParseException + { + return new TokenHelperImpl( token ); + } + + //***************************************************** private void createDefaultUsers() throws SystemSecurityException, UserExistsException { @@ -303,10 +314,29 @@ public Session loginSystemUser() @PermitAll @Override - public Session login( String bearerToken ) + public Session login( HttpServletRequest request, Message message ) { try { + + final String bearerToken = getBearerToken( request ); + if ( bearerToken == null ) + { + return null; + } + + final TokenHelperImpl token = new TokenHelperImpl( bearerToken ); + String subject = token.getSubject(); + if ( subject == null ) + { + return null; + } + + Map> headers = ( Map> ) message.get( Message.PROTOCOL_HEADERS ); + headers.put( "subutaiOrigin", Arrays.asList( token.getSubject() ) ); + + message.put( Message.PROTOCOL_HEADERS, headers ); + return verifyJWTToken( bearerToken ) ? loginSystemUser() : null; } catch ( TokenParseException e ) @@ -316,18 +346,30 @@ public Session login( String bearerToken ) } + private String getBearerToken( HttpServletRequest request ) + { + String authorization = request.getHeader( "Authorization" ); + String result = null; + if ( authorization != null && authorization.startsWith( "Bearer" ) ) + { + String[] splittedAuthString = authorization.split( "\\s" ); + result = splittedAuthString.length == 2 ? splittedAuthString[1] : null; + } + return result; + } + + @Override - public String issueJWTToken( String environmentId, String containerId ) throws TokenCreateException + public String issueJWTToken(String origin ) throws TokenCreateException { final String secret = UUID.randomUUID().toString(); DateTime issueDate = DateTime.now(); DateTime expireDate = issueDate.plusSeconds( JWT_TOKEN_EXPIRATION_TIME ); String token = - new TokenHelper( TOKEN_ISSUER, environmentId, containerId, issueDate.toDate(), expireDate.toDate(), - secret ).getToken(); + new TokenHelperImpl( TOKEN_ISSUER, origin, issueDate.toDate(), expireDate.toDate(), secret ).getToken(); - this.jwtTokenCache.put( containerId, secret ); + this.jwtTokenCache.put( origin, secret ); return token; } @@ -336,7 +378,7 @@ public String issueJWTToken( String environmentId, String containerId ) throws T public boolean verifyJWTToken( String token ) throws TokenParseException { - final TokenHelper signedToken = new TokenHelper( token ); + final TokenHelperImpl signedToken = new TokenHelperImpl( token ); if ( signedToken.getExpirationTime().before( new Date() ) ) { return false; diff --git a/management/server/core/identity-manager/identity-manager-impl/src/main/java/io/subutai/core/identity/impl/utils/TokenHelper.java b/management/server/core/identity-manager/identity-manager-impl/src/main/java/io/subutai/core/identity/impl/utils/TokenHelperImpl.java similarity index 66% rename from management/server/core/identity-manager/identity-manager-impl/src/main/java/io/subutai/core/identity/impl/utils/TokenHelper.java rename to management/server/core/identity-manager/identity-manager-impl/src/main/java/io/subutai/core/identity/impl/utils/TokenHelperImpl.java index b06fe26b3cc..7edde6456a8 100644 --- a/management/server/core/identity-manager/identity-manager-impl/src/main/java/io/subutai/core/identity/impl/utils/TokenHelper.java +++ b/management/server/core/identity-manager/identity-manager-impl/src/main/java/io/subutai/core/identity/impl/utils/TokenHelperImpl.java @@ -3,7 +3,6 @@ import java.text.ParseException; import java.util.Date; -import java.util.List; import com.nimbusds.jose.JOSEException; import com.nimbusds.jose.JWSAlgorithm; @@ -15,22 +14,23 @@ import com.nimbusds.jwt.JWTClaimsSet; import com.nimbusds.jwt.SignedJWT; +import io.subutai.core.identity.api.TokenHelper; import io.subutai.core.identity.api.exception.TokenCreateException; import io.subutai.core.identity.api.exception.TokenParseException; -public class TokenHelper +public class TokenHelperImpl implements TokenHelper { private SignedJWT signedJWT; private String token; - public TokenHelper( String issuer, String environmentId, String containerId, Date issueTime, Date expireTime, - String secret ) throws TokenCreateException + public TokenHelperImpl( String issuer, String subject, Date issueTime, Date expireTime, String secret ) + throws TokenCreateException { try { - this.token = generate( issuer, environmentId, containerId, issueTime, expireTime, secret ); + this.token = generate( issuer, subject, issueTime, expireTime, secret ); } catch ( JOSEException e ) { @@ -39,12 +39,12 @@ public TokenHelper( String issuer, String environmentId, String containerId, Dat } - public TokenHelper( String token ) throws TokenParseException + public TokenHelperImpl( String token ) throws TokenParseException { - this.token = token; try { this.signedJWT = SignedJWT.parse( token ); + this.token = token; } catch ( ParseException e ) { @@ -53,13 +53,13 @@ public TokenHelper( String token ) throws TokenParseException } - protected String generate( String issuer, String environmentId, String containerId, Date issueTime, Date expireTime, - String secret ) throws JOSEException + protected String generate( final String issuer, final String subject, final Date issueTime, final Date expireTime, + final String secret ) throws JOSEException { JWSHeader jwtHeader = new JWSHeader( JWSAlgorithm.HS256 ); JWTClaimsSet claimset = new JWTClaimsSet.Builder().expirationTime( expireTime ).issuer( issuer ).issueTime( issueTime ) - .subject( containerId ).audience( environmentId ).build(); + .subject( subject ).build(); SignedJWT jwt = new SignedJWT( jwtHeader, claimset ); JWSSigner signer = new MACSigner( secret ); @@ -68,12 +68,14 @@ protected String generate( String issuer, String environmentId, String container } + @Override public String getToken() { return token; } + @Override public boolean verify( String secret ) { try @@ -88,6 +90,7 @@ public boolean verify( String secret ) } + @Override public String getSubject() throws TokenParseException { try @@ -101,24 +104,7 @@ public String getSubject() throws TokenParseException } - public String getAudience() throws TokenParseException - { - try - { - List audience = this.signedJWT.getJWTClaimsSet().getAudience(); - if ( audience == null || audience.isEmpty() ) - { - return null; - } - return audience.get( 0 ); - } - catch ( ParseException e ) - { - throw new TokenParseException( e.getMessage() ); - } - } - - + @Override public Date getExpirationTime() throws TokenParseException { try diff --git a/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/Event.java b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/Event.java new file mode 100644 index 00000000000..ecfd9022f47 --- /dev/null +++ b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/Event.java @@ -0,0 +1,24 @@ +package io.subutai.hub.share.event; + + +import java.util.List; + +import io.subutai.hub.share.event.meta.CustomMeta; +import io.subutai.hub.share.event.meta.OriginMeta; +import io.subutai.hub.share.event.payload.Payload; + + +public interface Event +{ + Payload getPayload(); + + void addTrace( String place ); + + long getTimestamp(); + + OriginMeta getOrigin(); + + void addCustomMeta( CustomMeta customMeta ); + + List getCustomMetaByKey( String key ); +} diff --git a/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/EventMessage.java b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/EventMessage.java new file mode 100644 index 00000000000..9355aa6e7fb --- /dev/null +++ b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/EventMessage.java @@ -0,0 +1,91 @@ +package io.subutai.hub.share.event; + + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; + +import io.subutai.hub.share.event.meta.CustomMeta; +import io.subutai.hub.share.event.meta.OriginMeta; +import io.subutai.hub.share.event.meta.SourceMeta; +import io.subutai.hub.share.event.meta.TraceMeta; +import io.subutai.hub.share.event.payload.Payload; + + +@JsonAutoDetect( fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, + setterVisibility = JsonAutoDetect.Visibility.NONE ) +public class EventMessage implements Event +{ + @JsonProperty( value = "metaData", required = true ) + private MetaData metaData; + + @JsonProperty( value = "payload", required = true ) + private Payload payload; + + + @JsonProperty( value = "timestamp" ) + private long timestamp = System.currentTimeMillis(); + + + public EventMessage( final OriginMeta origin, final SourceMeta source, final Payload payload ) + { + this.payload = payload; + this.metaData = new MetaData( origin, source ); + } + + + protected EventMessage() + { + } + + + @Override + public OriginMeta getOrigin() + { + return this.metaData.getOrigin(); + } + + + @Override + public Payload getPayload() + { + return payload; + } + + + @Override + public long getTimestamp() + { + return timestamp; + } + + + @Override + public void addTrace( final String place ) + { + this.metaData.addMeta( new TraceMeta( place ) ); + } + + + @JsonIgnore + public List getTrace() + { + return metaData.getTrace(); + } + + + @Override + public void addCustomMeta( CustomMeta customMeta ) + { + this.metaData.addMeta( customMeta ); + } + + + @Override + public List getCustomMetaByKey( final String key ) + { + return this.metaData.getCustomMetaByKey( key ); + } +} diff --git a/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/MetaData.java b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/MetaData.java new file mode 100644 index 00000000000..10f1a0067a6 --- /dev/null +++ b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/MetaData.java @@ -0,0 +1,88 @@ +package io.subutai.hub.share.event; + + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.base.Preconditions; + +import io.subutai.hub.share.event.meta.CustomMeta; +import io.subutai.hub.share.event.meta.Meta; +import io.subutai.hub.share.event.meta.OriginMeta; +import io.subutai.hub.share.event.meta.SourceMeta; +import io.subutai.hub.share.event.meta.TraceMeta; + + +@JsonAutoDetect( fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, + setterVisibility = JsonAutoDetect.Visibility.NONE ) +public class MetaData +{ + @JsonProperty( value = "origin" ) + final private OriginMeta origin; + + @JsonProperty( value = "source" ) + final private SourceMeta source; + + private List items = new ArrayList<>(); + + + @JsonCreator + public MetaData( @JsonProperty( value = "meta" ) final OriginMeta origin, + @JsonProperty( value = "source" ) final SourceMeta source ) + { + this.origin = origin; + this.source = source; + } + + + public OriginMeta getOrigin() + { + return origin; + } + + + public SourceMeta getSource() + { + return source; + } + + + public List getAllMeta() + { + return this.items; + } + + + public List getCustomMetaByKey( String key ) + { + final List result = + this.items.stream().filter( m -> m instanceof CustomMeta ).map( CustomMeta.class::cast ) + .filter( m -> m.getKey().equals( key ) ).collect( Collectors.toList() ); + return result; + } + + + List getTrace() + { + return getMetaByObjectClass( TraceMeta.class ); + } + + + private List getMetaByObjectClass( Class objectClass ) + { + final List result = this.items.stream().filter( objectClass::isInstance ).map( objectClass::cast ) + .collect( Collectors.toList() ); + return result; + } + + + public void addMeta( final Meta meta ) + { + Preconditions.checkNotNull( meta ); + this.items.add( meta ); + } +} diff --git a/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/CustomMeta.java b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/CustomMeta.java new file mode 100644 index 00000000000..5d49df22367 --- /dev/null +++ b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/CustomMeta.java @@ -0,0 +1,39 @@ +package io.subutai.hub.share.event.meta; + + +public class CustomMeta implements Meta +{ + private String key; + private String value; + + + public CustomMeta( final String key, final String value ) + { + this.key = key; + this.value = value; + } + + + private CustomMeta() + { + } + + + public String getKey() + { + return key; + } + + + public String getValue() + { + return value; + } + + + @Override + public String toString() + { + return "StringMetaData{" + "value='" + value + '\'' + '}'; + } +} diff --git a/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/Meta.java b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/Meta.java new file mode 100644 index 00000000000..d5a7e8295d0 --- /dev/null +++ b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/Meta.java @@ -0,0 +1,20 @@ +package io.subutai.hub.share.event.meta; + + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; + + +@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type" ) +@JsonSubTypes( { + @JsonSubTypes.Type( value = CustomMeta.class, name = "custom" ), + @JsonSubTypes.Type( value = TraceMeta.class, name = "trace" ), + @JsonSubTypes.Type( value = SourceMeta.class, name = "source" ), + @JsonSubTypes.Type( value = OriginMeta.class, name = "origin" ) +} ) +@JsonAutoDetect( fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, + setterVisibility = JsonAutoDetect.Visibility.NONE ) +public interface Meta +{ +} diff --git a/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/OriginMeta.java b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/OriginMeta.java new file mode 100644 index 00000000000..924a500ad03 --- /dev/null +++ b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/OriginMeta.java @@ -0,0 +1,81 @@ +package io.subutai.hub.share.event.meta; + + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.google.common.base.Preconditions; + + +public class OriginMeta implements Meta +{ + private String id; + + @JsonIgnore + private String peerId; + + @JsonIgnore + private String containerId; + + @JsonIgnore + private String environmentId; + + + @JsonCreator + public OriginMeta( final String subutaiOrigin ) + { + Preconditions.checkNotNull( subutaiOrigin ); + this.id = subutaiOrigin; + prase(); + } + + + private OriginMeta() + { + } + + + private void prase() + { + final String[] splittedOrigins = this.id.split( ":" ); + this.peerId = splittedOrigins[0]; + if ( splittedOrigins.length > 1 ) + { + this.containerId = splittedOrigins[1]; + if ( splittedOrigins.length > 2 ) + { + this.environmentId = splittedOrigins[2]; + } + } + } + + + public String getId() + { + return id; + } + + + public String getPeerId() + { + return peerId; + } + + + public String getEnvironmentId() + { + return environmentId; + } + + + public String getContainerId() + { + return containerId; + } + + + @Override + public String toString() + { + return String.format( "%s:%s:%s", peerId, environmentId, containerId ); + } +} diff --git a/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/SourceMeta.java b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/SourceMeta.java new file mode 100644 index 00000000000..499929b4cd0 --- /dev/null +++ b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/SourceMeta.java @@ -0,0 +1,50 @@ +package io.subutai.hub.share.event.meta; + + +import com.fasterxml.jackson.annotation.JsonAutoDetect; + + +@JsonAutoDetect( fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, + setterVisibility = JsonAutoDetect.Visibility.NONE ) +public class SourceMeta implements Meta +{ + public enum Type + { + CUSTOM, CONTAINER, BLUEPRINT + } + + + private String name; + private Type type; + + + public SourceMeta( final String name, final Type type ) + { + this.name = name; + this.type = type; + } + + + public SourceMeta( final String name ) + { + this.name = name; + this.type = Type.CUSTOM; + } + + + private SourceMeta() + { + } + + + public String getName() + { + return name; + } + + + public Type getType() + { + return type; + } +} diff --git a/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/TraceMeta.java b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/TraceMeta.java new file mode 100644 index 00000000000..6087b0987eb --- /dev/null +++ b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/meta/TraceMeta.java @@ -0,0 +1,45 @@ +package io.subutai.hub.share.event.meta; + + +import java.time.Instant; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; + + +@JsonAutoDetect( fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, + setterVisibility = JsonAutoDetect.Visibility.NONE ) +public class TraceMeta implements Meta +{ + private String place; + private long timestamp = Instant.now().getEpochSecond(); + + + public TraceMeta( final String place ) + { + this.place = place; + } + + + public TraceMeta() + { + } + + + public String getPlace() + { + return place; + } + + + public long getTimestamp() + { + return timestamp; + } + + + @Override + public String toString() + { + return "TraceMeta{" + "place='" + place + '\'' + ", timestamp=" + timestamp + '}'; + } +} diff --git a/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/CustomPayload.java b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/CustomPayload.java new file mode 100644 index 00000000000..1867f58a054 --- /dev/null +++ b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/CustomPayload.java @@ -0,0 +1,42 @@ +package io.subutai.hub.share.event.payload; + + +import com.fasterxml.jackson.annotation.JsonProperty; + + +public class CustomPayload extends Payload +{ + @JsonProperty( value = "message", required = true ) + protected String message; + + + public CustomPayload( final String message ) + { + this.message = message; + } + + + CustomPayload() + { + } + + + @Override + Nature getNature() + { + return Nature.CUSTOM; + } + + + public String getMessage() + { + return message; + } + + + @Override + public String toString() + { + return "StringPayload{" + "message='" + message + '\'' + '}'; + } +} diff --git a/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/LogPayload.java b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/LogPayload.java new file mode 100644 index 00000000000..61949f17927 --- /dev/null +++ b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/LogPayload.java @@ -0,0 +1,94 @@ +package io.subutai.hub.share.event.payload; + + +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonProperty; + + +public class LogPayload extends Payload +{ + public enum Level + { + TRACE, DEBUG, INFO, WARN, ERROR, FATAL + } + + + @JsonProperty( value = "source", required = true ) + protected String source; + + @JsonProperty( value = "message", required = true ) + protected String message; + + @JsonProperty( value = "level", required = true ) + protected Level level; + + + public LogPayload( final String source, final String message, final Level level ) + { + this.source = source; + this.message = message; + this.level = level; + } + + + LogPayload() + { + } + + + @Override + Nature getNature() + { + return Nature.LOG; + } + + + public String getSource() + { + return source; + } + + + public String getMessage() + { + return message; + } + + + public Level getLevel() + { + return level; + } + + + @Override + public boolean equals( final Object o ) + { + if ( this == o ) + { + return true; + } + if ( o == null || getClass() != o.getClass() ) + { + return false; + } + final LogPayload that = ( LogPayload ) o; + return Objects.equals( source, that.source ) && Objects.equals( message, that.message ) && level == that.level; + } + + + @Override + public int hashCode() + { + + return Objects.hash( source, message, level ); + } + + + @Override + public String toString() + { + return "LogPayload{" + "source='" + source + '\'' + ", message='" + message + '\'' + ", level=" + level + '}'; + } +} diff --git a/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/Payload.java b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/Payload.java new file mode 100644 index 00000000000..e9e798841fd --- /dev/null +++ b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/Payload.java @@ -0,0 +1,26 @@ +package io.subutai.hub.share.event.payload; + + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; + + +@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type" ) +@JsonSubTypes( { + @JsonSubTypes.Type( value = CustomPayload.class, name = "custom" ), + @JsonSubTypes.Type( value = LogPayload.class, name = "log" ), + @JsonSubTypes.Type( value = ProgressPayload.class, name = "progress" ) +} ) +@JsonAutoDetect( fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, + setterVisibility = JsonAutoDetect.Visibility.NONE ) +abstract public class Payload +{ + public enum Nature + { + CUSTOM, LOG, PROGRESS + } + + + abstract Nature getNature(); +} diff --git a/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/ProgressPayload.java b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/ProgressPayload.java new file mode 100644 index 00000000000..d64dfee771a --- /dev/null +++ b/management/server/subutai-hub-share/src/main/java/io/subutai/hub/share/event/payload/ProgressPayload.java @@ -0,0 +1,89 @@ +package io.subutai.hub.share.event.payload; + + +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonProperty; + + +public class ProgressPayload extends Payload +{ + @JsonProperty( value = "step", required = true ) + private String step; + + @JsonProperty( value = "message", required = true ) + private String message; + + @JsonProperty( value = "value", required = true ) + private double value; + + + public ProgressPayload( final String step, final String message, final double value ) + { + this.step = step; + this.message = message; + this.value = value; + } + + + private ProgressPayload() + { + } + + + @Override + Nature getNature() + { + return Nature.PROGRESS; + } + + + public String getStep() + { + return step; + } + + + public String getMessage() + { + return message; + } + + + public double getValue() + { + return value; + } + + + @Override + public boolean equals( final Object o ) + { + if ( this == o ) + { + return true; + } + if ( o == null || getClass() != o.getClass() ) + { + return false; + } + final ProgressPayload that = ( ProgressPayload ) o; + return Double.compare( that.value, value ) == 0 && Objects.equals( step, that.step ) && Objects + .equals( message, that.message ); + } + + + @Override + public int hashCode() + { + + return Objects.hash( step, message, value ); + } + + + @Override + public String toString() + { + return "ProgressPayload{" + "step='" + step + '\'' + ", message='" + message + '\'' + ", value=" + value + '}'; + } +} \ No newline at end of file diff --git a/management/server/subutai-hub-share/src/test/java/io/subutai/hub/share/event/EventMessageTest.java b/management/server/subutai-hub-share/src/test/java/io/subutai/hub/share/event/EventMessageTest.java new file mode 100644 index 00000000000..eeb980c716d --- /dev/null +++ b/management/server/subutai-hub-share/src/test/java/io/subutai/hub/share/event/EventMessageTest.java @@ -0,0 +1,92 @@ +package io.subutai.hub.share.event; + + +import java.io.IOException; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +import io.subutai.hub.share.event.meta.CustomMeta; +import io.subutai.hub.share.event.meta.OriginMeta; +import io.subutai.hub.share.event.meta.SourceMeta; +import io.subutai.hub.share.event.meta.TraceMeta; +import io.subutai.hub.share.event.payload.LogPayload; +import io.subutai.hub.share.event.payload.ProgressPayload; + +import static org.junit.Assert.assertEquals; + + +public class EventMessageTest extends ObjectMapperTest +{ + + public static final String FIRST_PLACE = "container"; + public static final String SECOND_PLACE = "peer"; + public static final String THIRD_PLACE = "hub"; + private ProgressPayload progressPayload; + private OriginMeta origin; + private SourceMeta source; + private EventMessage originalObject; + private LogPayload logPayload; + + + @Before + public void setup() + { + super.setup(); + progressPayload = new ProgressPayload( "step", "message", 99.0 ); + + logPayload = new LogPayload("source", "initiated", LogPayload.Level.INFO); + + origin = new OriginMeta( "subutaiPeer:subutaiContainer:subutaiEnvironment" ); + + source = new SourceMeta( "cassandra-blueprint", SourceMeta.Type.BLUEPRINT ); + } + + + @Test + public void testProgressPayloadSerializationAndDeserialization() throws IOException + { + originalObject = new EventMessage( origin, source, progressPayload ); + originalObject.addCustomMeta( new CustomMeta( "OS", "Linux" ) ); + originalObject.addCustomMeta( new CustomMeta( "bash", "sh" ) ); + + final String json = objectMapper.writeValueAsString( originalObject ); + + System.out.println( json ); + + final EventMessage restoredObject = objectMapper.readValue( json, EventMessage.class ); + + assertEquals( originalObject.getPayload(), restoredObject.getPayload() ); + } + + + @Test + public void testEventTrace() + { + originalObject = new EventMessage( origin, source, progressPayload ); + originalObject.addTrace( FIRST_PLACE ); + originalObject.addTrace( SECOND_PLACE ); + originalObject.addTrace( THIRD_PLACE ); + + List trace = originalObject.getTrace(); + + assertEquals( trace.get( 0 ).getPlace(), FIRST_PLACE ); + assertEquals( trace.get( 1 ).getPlace(), SECOND_PLACE ); + assertEquals( trace.get( 2 ).getPlace(), THIRD_PLACE ); + } + + @Test + public void testLogPayloadSerializationAndDeserialization() throws IOException + { + originalObject = new EventMessage( origin, source, logPayload ); + + final String json = objectMapper.writeValueAsString( originalObject ); + + System.out.println( json ); + + final EventMessage restoredObject = objectMapper.readValue( json, EventMessage.class ); + + assertEquals( originalObject.getPayload(), restoredObject.getPayload() ); + } +} \ No newline at end of file diff --git a/management/server/subutai-hub-share/src/test/java/io/subutai/hub/share/event/ObjectMapperTest.java b/management/server/subutai-hub-share/src/test/java/io/subutai/hub/share/event/ObjectMapperTest.java new file mode 100644 index 00000000000..b42436a0af9 --- /dev/null +++ b/management/server/subutai-hub-share/src/test/java/io/subutai/hub/share/event/ObjectMapperTest.java @@ -0,0 +1,19 @@ +package io.subutai.hub.share.event; + + +import org.junit.Before; + +import com.fasterxml.jackson.databind.ObjectMapper; + + +public class ObjectMapperTest +{ + protected ObjectMapper objectMapper; + + + @Before + public void setup() + { + objectMapper = new ObjectMapper(); + } +}