Commit 36da045c authored by Francesco Chicchiricco's avatar Francesco Chicchiricco
Browse files

[CRV-17] Post chorSpec to /chors, be notified back after 3 secs by choremocks,...

[CRV-17] Post chorSpec to /chors, be notified back after 3 secs by choremocks, create Choreography group in Syncope
parent f533587a
......@@ -66,6 +66,17 @@ limitations under the License.
<artifactId>sf-provision-data</artifactId>
</dependency>
<dependency>
<groupId>eu.chorevolution.idm.ext.choreography</groupId>
<artifactId>syncope-ext-choreography-rest-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.syncope.client</groupId>
<artifactId>syncope-client-lib</artifactId>
<version>${syncope.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
......
......@@ -24,8 +24,10 @@ import java.io.InputStream;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
......@@ -95,6 +97,25 @@ public interface ChoreographyApi {
@ApiParam(name = "chorSpec", value = "Choreography specifications", required = true)
InputStream chorSpec);
@PUT
@Path("/update/{choreographyId}")
@Consumes(MediaType.APPLICATION_JSON)
@ApiOperation(
value = "Deploy a choreography onto a cloud environment.",
response = org.apache.brooklyn.rest.domain.TaskSummary.class
)
@ApiResponses(value = {
@ApiResponse(code = 404, message = "Undefined entity or location"),
@ApiResponse(code = 412, message = "Choreography already registered")
})
Response update(
@ApiParam(name = "choreographyId", value = "Choreography ID", required = true)
@PathParam("choreographyId") String choreographyId,
@ApiParam(name = "choreographyName", value = "Choreography name", required = true)
@QueryParam("choreographyName") String choreographyName,
@ApiParam(name = "chorSpec", value = "Choreography specifications", required = true)
InputStream chorSpec);
@POST
@Path("/resize/{choreographyId}")
@Consumes(MediaType.APPLICATION_JSON)
......
......@@ -15,24 +15,53 @@
*/
package eu.chorevolution.idm.choremocks.ee;
import eu.chorevolution.idm.common.types.ChoreographyOperation;
import java.io.InputStream;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.apache.brooklyn.rest.domain.TaskSummary;
import org.apache.syncope.client.lib.SyncopeClient;
import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
import org.apache.syncope.common.rest.api.service.ChoreographyService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class ChoreographyResource implements ChoreographyApi {
private static final Logger LOG = LoggerFactory.getLogger(ChoreographyResource.class);
private static final Set<String> DEPLOYED = Collections.synchronizedSet(new HashSet<>());
private static final ScheduledExecutorService EXECUTOR = Executors.newScheduledThreadPool(5);
@Context
private UriInfo uriInfo;
@Override
public Response deploy(final String choreographyName, final InputStream chorSpec) {
String choreographyId = UUID.randomUUID().toString();
DEPLOYED.add(choreographyId);
EXECUTOR.schedule(new CompletionNotifier(
choreographyId,
choreographyName,
ChoreographyOperation.CREATE,
"All good",
getClass().getResourceAsStream("/" + choreographyName + "_create.xml")),
3, TimeUnit.SECONDS);
return Response.created(uriInfo.getAbsolutePathBuilder().path(choreographyId).build()).
entity(new TaskSummary(
UUID.randomUUID().toString(),
......@@ -58,6 +87,45 @@ public class ChoreographyResource implements ChoreographyApi {
build();
}
@Override
public Response update(final String choreographyId, final String choreographyName, final InputStream chorSpec) {
if (!DEPLOYED.contains(choreographyId)) {
throw new NotFoundException("Choreography " + choreographyId);
}
EXECUTOR.schedule(new CompletionNotifier(
choreographyId,
choreographyName,
ChoreographyOperation.UPDATE,
"All good",
getClass().getResourceAsStream("/" + choreographyName + "_update.xml")),
3, TimeUnit.SECONDS);
return Response.ok().
entity(new TaskSummary(
UUID.randomUUID().toString(),
"Update Task for " + choreographyId,
null,
choreographyId,
choreographyName,
null,
new Date().getTime(),
new Date().getTime(),
new Date().getTime(),
"SUBMITTED",
null,
false,
false,
null,
null,
null,
null,
null,
null,
null)).
build();
}
@Override
public Response start(final String choreography_id) {
return null;
......@@ -65,6 +133,20 @@ public class ChoreographyResource implements ChoreographyApi {
@Override
public Response stop(final String choreographyId) {
if (!DEPLOYED.contains(choreographyId)) {
throw new NotFoundException("Choreography " + choreographyId);
}
DEPLOYED.remove(choreographyId);
EXECUTOR.schedule(new CompletionNotifier(
choreographyId,
null,
ChoreographyOperation.DELETE,
"All good",
null),
3, TimeUnit.SECONDS);
return Response.noContent().
entity(new TaskSummary(
UUID.randomUUID().toString(),
......@@ -105,4 +187,45 @@ public class ChoreographyResource implements ChoreographyApi {
return null;
}
private static class CompletionNotifier implements Runnable {
private final String id;
private final String name;
private final ChoreographyOperation operation;
private final String message;
private final InputStream enactedChorSpec;
private final SyncopeClient client;
public CompletionNotifier(
final String id,
final String name,
final ChoreographyOperation operation,
final String message,
final InputStream enactedChorSpec) {
this.id = id;
this.name = name;
this.operation = operation;
this.message = message;
this.enactedChorSpec = enactedChorSpec;
client = new SyncopeClientFactoryBean().
setAddress("http://localhost:9080/syncope/rest").
create("admin", "password");
}
@Override
public void run() {
LOG.debug("Notifying {} {}", id, operation);
client.getService(ChoreographyService.class).
notifyCompletion(id, name, operation, message, enactedChorSpec);
LOG.debug("Notified {} {}", id, operation);
}
}
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
Copyright 2015 The CHOReVOLUTION project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<choreography id="13de56fd-4ddb-4a5a-847c-75672d57f2af">
<service_group>
<service xsi:type="existingService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>JourneyPlanner</name>
<role>Journey Planner</role>
<url>http://localhost:8080/JourneyPlanner/JourneyPlanner</url>
</service>
<service xsi:type="existingService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>OSMParking</name>
<role>OSM Parking</role>
<url>http://localhost:8080/OSMParking/OSMParking</url>
</service>
<service xsi:type="existingService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>Poi</name>
<role>Poi</role>
<url>http://localhost:8080/Poi/Poi</url>
</service>
<service xsi:type="existingService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>PublicTransportation</name>
<role>Public Transportation</role>
<url>http://localhost:8080/PublicTransportation/PublicTransportation</url>
</service>
<service xsi:type="existingService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>News</name>
<role>News</role>
<url>http://localhost:8080/News/News</url>
</service>
<service xsi:type="existingService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>STApp</name>
<role>STApp</role>
<url>http://localhost:8080/STApp/STApp</url>
</service>
<service xsi:type="existingService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>TrafficInformation</name>
<role>Traffic Information</role>
<url>http://localhost:8080/TrafficInformation/TrafficInformation</url>
</service>
<service xsi:type="existingService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>Weather</name>
<role>Weather</role>
<url>http://localhost:8080/Weather/Weather</url>
</service>
<service xsi:type="deployedService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>consumercdtripplanner</name>
<role>Consumer Trip Planner</role>
<instances>1</instances>
<packageType>WAR</packageType>
<packageUrl>http://localhost:8080/cdtripplanner/cdtripplanner</packageUrl>
<serviceType>COORDINATION_DELEGATE</serviceType>
<url>http://192.168.150.142/ode/processes/cdtripplanner</url>
<deploymentInfo>
<endpoint>http://192.168.150.130:8080/ode/processes/cdtripplanner</endpoint>
<node>
<cpus>2</cpus>
<hostname>chornode1</hostname>
<image>af036b89-0ef4-48e9-99ac-51b0cf9c314e</image>
<ip>192.168.150.130</ip>
<os>Ubuntu</os>
<privateKeyFile>/etc/enactment-engine/eekey.pem</privateKeyFile>
<ram>1024</ram>
<state>1</state>
<storage>10000</storage>
<user>ubuntu</user>
<zone>RegionOne</zone>
</node>
</deploymentInfo>
</service>
<service xsi:type="deployedService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>consumercdtouristagent</name>
<role>Consumer Tourist Agent</role>
<instances>1</instances>
<packageType>WAR</packageType>
<packageUrl>http://localhost:8080/cdtouristagent/cdtouristagent</packageUrl>
<serviceType>COORDINATION_DELEGATE</serviceType>
<url>http://192.168.150.142/ode/processes/cdtouristagent</url>
<deploymentInfo>
<endpoint>http://192.168.150.130:8080/ode/processes/cdtouristagent</endpoint>
<node>
<cpus>2</cpus>
<hostname>chornode1</hostname>
<image>af036b89-0ef4-48e9-99ac-51b0cf9c314e</image>
<ip>192.168.150.130</ip>
<os>Ubuntu</os>
<privateKeyFile>/etc/enactment-engine/eekey.pem</privateKeyFile>
<ram>1024</ram>
<state>1</state>
<storage>10000</storage>
<user>ubuntu</user>
<zone>RegionOne</zone>
</node>
</deploymentInfo>
</service>
<service xsi:type="deployedService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>cdtripplanner</name>
<role>Trip Planner</role>
<dependency>
<serviceSpecName>consumercdtripplanner</serviceSpecName>
<serviceSpecRole>Consumer Trip Planner</serviceSpecRole>
</dependency>
<dependency>
<serviceSpecName>TrafficInformation</serviceSpecName>
<serviceSpecRole>Traffic Information</serviceSpecRole>
</dependency>
<dependency>
<serviceSpecName>JourneyPlanner</serviceSpecName>
<serviceSpecRole>Journey Planner</serviceSpecRole>
</dependency>
<dependency>
<serviceSpecName>OSMParking</serviceSpecName>
<serviceSpecRole>OSM Parking</serviceSpecRole>
</dependency>
<dependency>
<serviceSpecName>PublicTransportation</serviceSpecName>
<serviceSpecRole>Public Transportation</serviceSpecRole>
</dependency>
<dependency>
<serviceSpecName>Weather</serviceSpecName>
<serviceSpecRole>Weather</serviceSpecRole>
</dependency>
<dependency>
<serviceSpecName>cdtouristagent</serviceSpecName>
<serviceSpecRole>Tourist Agent</serviceSpecRole>
</dependency>
<instances>1</instances>
<packageType>ODE</packageType>
<packageUrl>http://localhost:8080/cdtripplanner/cdtripplanner.war</packageUrl>
<serviceType>COORDINATION_DELEGATE</serviceType>
<url>http://192.168.150.142/ode/processes/cdtripplanner</url>
<deploymentInfo>
<endpoint>http://192.168.150.130:8080/ode/processes/cdtripplanner</endpoint>
<node>
<cpus>2</cpus>
<hostname>chornode1</hostname>
<image>af036b89-0ef4-48e9-99ac-51b0cf9c314e</image>
<ip>192.168.150.130</ip>
<os>Ubuntu</os>
<privateKeyFile>/etc/enactment-engine/eekey.pem</privateKeyFile>
<ram>1024</ram>
<state>1</state>
<storage>10000</storage>
<user>ubuntu</user>
<zone>RegionOne</zone>
</node>
</deploymentInfo>
</service>
<service xsi:type="deployedService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>cdtouristagent</name>
<role>Tourist Agent</role>
<dependency>
<serviceSpecName>consumercdtouristagent</serviceSpecName>
<serviceSpecRole>Consumer Tourist Agent</serviceSpecRole>
</dependency>
<dependency>
<serviceSpecName>Poi</serviceSpecName>
<serviceSpecRole>Poi</serviceSpecRole>
</dependency>
<dependency>
<serviceSpecName>News</serviceSpecName>
<serviceSpecRole>News</serviceSpecRole>
</dependency>
<dependency>
<serviceSpecName>cdtripplanner</serviceSpecName>
<serviceSpecRole>Trip Planner</serviceSpecRole>
</dependency>
<dependency>
<serviceSpecName>cdclientSTApp</serviceSpecName>
<serviceSpecRole>CD Client STApp</serviceSpecRole>
</dependency>
<instances>1</instances>
<packageType>ODE</packageType>
<packageUrl>http://localhost:8080/cdtouristagent/cdtouristagent.war</packageUrl>
<serviceType>COORDINATION_DELEGATE</serviceType>
<url>http://192.168.150.142/ode/processes/cdtouristagent</url>
<deploymentInfo>
<endpoint>http://192.168.150.130:8080/ode/processes/cdtouristagent</endpoint>
<node>
<cpus>2</cpus>
<hostname>chornode1</hostname>
<image>af036b89-0ef4-48e9-99ac-51b0cf9c314e</image>
<ip>192.168.150.130</ip>
<os>Ubuntu</os>
<privateKeyFile>/etc/enactment-engine/eekey.pem</privateKeyFile>
<ram>1024</ram>
<state>1</state>
<storage>10000</storage>
<user>ubuntu</user>
<zone>RegionOne</zone>
</node>
</deploymentInfo>
</service>
<service xsi:type="deployedService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>cdclientSTApp</name>
<role>CD Client STApp</role>
<dependency>
<serviceSpecName>cdtouristagent</serviceSpecName>
<serviceSpecRole>Tourist Agent</serviceSpecRole>
</dependency>
<instances>1</instances>
<packageType>ODE</packageType>
<packageUrl>http://localhost:8080/STApp/STApp.war</packageUrl>
<serviceType>COORDINATION_DELEGATE</serviceType>
<url>http://192.168.150.142/ode/processes/STApp</url>
<deploymentInfo>
<endpoint>http://192.168.150.130:8080/ode/processes/STApp</endpoint>
<node>
<cpus>2</cpus>
<hostname>chornode1</hostname>
<image>af036b89-0ef4-48e9-99ac-51b0cf9c314e</image>
<ip>192.168.150.130</ip>
<os>Ubuntu</os>
<privateKeyFile>/etc/enactment-engine/eekey.pem</privateKeyFile>
<ram>1024</ram>
<state>1</state>
<storage>10000</storage>
<user>ubuntu</user>
<zone>RegionOne</zone>
</node>
</deploymentInfo>
</service>
</service_group>
</choreography>
......@@ -271,7 +271,7 @@ ORYX.Editor.createByUrl = function(modelUrl){"/>
<cargo.tomcat.ajp.port>${cargo.tomcat.ajp.port}</cargo.tomcat.ajp.port>
<cargo.rmi.port>${cargo.rmi.port}</cargo.rmi.port>
<cargo.jvmargs>-noverify -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:MaxPermSize=256m</cargo.jvmargs>
<cargo.jvmargs>-noverify -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC</cargo.jvmargs>
</properties>
</configuration>
<deployables>
......
/*
* Copyright 2016 The CHOReVOLUTION project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.syncope.core.workflow.java;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.syncope.common.lib.patch.GroupPatch;
import org.apache.syncope.common.lib.to.GroupTO;
import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.syncope.common.lib.types.ResourceOperation;
import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
import org.apache.syncope.core.persistence.api.entity.AnyUtils;
import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
import org.apache.syncope.core.persistence.api.entity.PlainSchema;
import org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
import org.apache.syncope.core.persistence.api.entity.group.Group;
import org.apache.syncope.core.provisioning.api.PropagationByResource;
import org.apache.syncope.core.provisioning.api.WorkflowResult;
import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
public class ChorevolutionGroupWorkflowAdapter extends DefaultGroupWorkflowAdapter {
@Autowired
private PlainSchemaDAO plainSchemaDAO;
@Autowired
private AnyUtilsFactory anyUtilsFactory;
@Override
public WorkflowResult<String> create(final GroupTO groupTO) {
Group group = entityFactory.newEntity(Group.class);
if (groupTO.getAuxClasses().contains("Choreography")) {
AnyUtils anyUtils = anyUtilsFactory.getInstance(AnyTypeKind.GROUP);
PlainSchema schema = plainSchemaDAO.find("isChoreography");
if (schema != null) {
GPlainAttr attr = anyUtils.newPlainAttr();
attr.setOwner(group);
attr.setSchema(schema);
attr.add("true", anyUtils);
group.add(attr);
}
}
dataBinder.create(group, groupTO);
group = groupDAO.save(group);
PropagationByResource propByRes = new PropagationByResource();
propByRes.set(ResourceOperation.CREATE, group.getResourceKeys());
return new WorkflowResult<>(group.getKey(), propByRes, "create");
}
@Override
protected WorkflowResult<String> doUpdate(final Group group, final GroupPatch groupPatch) {
if (CollectionUtils.collect(group.getAuxClasses(), EntityUtils.keyTransformer()).contains("Choreography")) {
GPlainAttr attr = group.getPlainAttr("isChoreography");
if (attr == null) {
PlainSchema schema = plainSchemaDAO.find("isChoreography");
if (schema != null) {
AnyUtils anyUtils = anyUtilsFactory.getInstance(AnyTypeKind.GROUP);
attr = anyUtils.newPlainAttr();
attr.setOwner(group);
attr.setSchema(schema);
attr.add("true", anyUtils);
group.add(attr);
}
}
}
return super.doUpdate(group, groupPatch);
}
}
......@@ -496,8 +496,8 @@ we are happy to inform you that the password request was execute successfully fo
<MappingItem id="f330ac36-1653-40e6-b0ac-36165330e61c" connObjectKey="0" extAttrName="isChoreography" intAttrName="isChoreography" mandatoryCondition="true" password="0" purpose="PROPAGATION" mapping_id="69e184ed-00a2-43f5-a184-ed00a283f5c1"/>
<!-- user template for realm / provided to propagate users, groups and choreographies towards FS -->
<ANYTEMPLATEREALM ID="5d326683-4291-490c-b266-834291690ccd" TEMPLATE="{&quot;@class&quot;:&quot;org.apache.syncope.common.lib.to.UserTO&quot;,&quot;creator&quot;:null,&quot;creationDate&quot;:null,&quot;lastModifier&quot;:null,&quot;lastChangeDate&quot;:null,&quot;key&quot;:null,&quot;type&quot;:&quot;USER&quot;,&quot;realm&quot;:&quot;/&quot;,&quot;status&quot;:null,&quot;password&quot;:null,&quot;token&quot;:null,&quot;tokenExpireTime&quot;:null,&quot;username&quot;:null,&quot;lastLoginDate&quot;:null,&quot;changePwdDate&quot;:null,&quot;failedLogins&quot;:null,&quot;securityQuestion&quot;:null,&quot;securityAnswer&quot;:null,&quot;mustChangePassword&quot;:false,&quot;auxClasses&quot;:[],&quot;plainAttrs&quot;:[{&quot;schema&quot;:&quot;email&quot;,&quot;values&quot;:[]},{&quot;schema&quot;:&quot;firstname&quot;,&quot;values&quot;:[]},{&quot;schema&quot;:&quot;lastname&quot;,&quot;values&quot;:[]}],&quot;derAttrs&quot;:[],&quot;virAttrs&quot;:[],&quot;resources&quot;:[&quot;Federation Server&quot;],&quot;roles&quot;:[],&quot;dynRoles&quot;:[],&quot;relationships&quot;:[],&quot;memberships&quot;:[],&quot;dynGroups&quot;:[]}" REALM_ID="ea696a4f-e77a-4ef1-be67-8f8093bc8686" ANYTYPE_ID="USER"/>
<ANYTEMPLATEREALM ID="bc8ac07e-3292-4ec9-8ac0-7e3292fec955" TEMPLATE="{&quot;@class&quot;:&quot;org.apache.syncope.common.lib.to.GroupTO&quot;,&quot;creator&quot;:null,&quot;creationDate&quot;:null,&quot;lastModifier&quot;:null,&quot;lastChangeDate&quot;:null,&quot;key&quot;:null,&quot;type&quot;:&quot;GROUP&quot;,&quot;realm&quot;:&quot;/&quot;,&quot;status&quot;:null,&quot;name&quot;:null,&quot;userOwner&quot;:null,&quot;groupOwner&quot;:null,&quot;udynMembershipCond&quot;:null,&quot;adynMembershipConds&quot;:{},&quot;auxClasses&quot;:[],&quot;plainAttrs&quot;:[],&quot;derAttrs&quot;:[],&quot;virAttrs&quot;:[],&quot;resources&quot;:[&quot;Federation Server&quot;],&quot;typeExtensions&quot;:[]}" REALM_ID="ea696a4f-e77a-4ef1-be67-8f8093bc8686" ANYTYPE_ID="GROUP"/>
<ANYTEMPLATEREALM ID="5d326683-4291-490c-b266-834291690ccd" TEMPLATE="{&quot;@class&quot;:&quot;org.apache.syncope.common.lib.to.UserTO&quot;,&quot;creator&quot;:null,&quot;creationDate&quot;:null,&quot;lastModifier&quot;:null,&quot;lastChangeDate&quot;:null,&quot;key&quot;:null,&quot;type&quot;:&quot;USER&quot;,&quot;realm&quot;:&quot;'/'&quot;,&quot;status&quot;:null,&quot;password&quot;:null,&quot;token&quot;:null,&quot;tokenExpireTime&quot;:null,&quot;username&quot;:null,&quot;lastLoginDate&quot;:null,&quot;changePwdDate&quot;:null,&quot;failedLogins&quot;:null,&quot;securityQuestion&quot;:null,&quot;securityAnswer&quot;:null,&quot;mustChangePassword&quot;:false,&quot;auxClasses&quot;:[],&quot;plainAttrs&quot;:[{&quot;schema&quot;:&quot;email&quot;,&quot;values&quot;:[]},{&quot;schema&quot;:&quot;firstname&quot;,&quot;values&quot;:[]},{&quot;schema&quot;:&quot;lastname&quot;,&quot;values&quot;:[]}],&quot;derAttrs&quot;:[],&quot;virAttrs&quot;:[],&quot;resources&quot;:[&quot;Federation Server&quot;],&quot;roles&quot;:[],&quot;dynRoles&quot;:[],&quot;relationships&quot;:[],&quot;memberships&quot;:[],&quot;dynGroups&quot;:[]}" REALM_ID="ea696a4f-e77a-4ef1-be67-8f8093bc8686" ANYTYPE_ID="USER"/>
<ANYTEMPLATEREALM ID="bc8ac07e-3292-4ec9-8ac0-7e3292fec955" TEMPLATE="{&quot;@class&quot;:&quot;org.apache.syncope.common.lib.to.GroupTO&quot;,&quot;creator&quot;:null,&quot;creationDate&quot;:null,&quot;lastModifier&quot;:null,&quot;lastChangeDate&quot;:null,&quot;key&quot;:null,&quot;type&quot;:&quot;GROUP&quot;,&quot;realm&quot;:&quot;'/'&quot;,&quot;status&quot;:null,&quot;name&quot;:null,&quot;userOwner&quot;:null,&quot;groupOwner&quot;:null,&quot;udynMembershipCond&quot;:null,&quot;adynMembershipConds&quot;:{},&quot;auxClasses&quot;:[],&quot;plainAttrs&quot;:[],&quot;derAttrs&quot;:[],&quot;virAttrs&quot;:[],&quot;resources&quot;:[],&quot;typeExtensions&quot;:[]}" REALM_ID="ea696a4f-e77a-4ef1-be67-8f8093bc8686" ANYTYPE_ID="GROUP"/>
<SyncopeSchema id="firstname"/>
<PlainSchema id="firstname" type="String" anyTypeClass_id="BaseUser"
......@@ -550,7 +550,7 @@ we are happy to inform you that the password request was execute successfully fo
multivalue="0" readonly="0" type="String" uniqueConstraint="1" anyTypeClass_id="Choreography"/>
<SyncopeSchema id="status"/>
<PlainSchema id="status" mandatoryCondition="true" mimeType="application/xml"
<PlainSchema id="status" mandatoryCondition="true"
multivalue="0" readonly="0" type="Enum" uniqueConstraint="0" enumerationValues="STARTED;FROZEN;STOPPED"
anyTypeClass_id="Choreography"/>
......@@ -558,6 +558,10 @@ we are happy to inform you that the password request was execute successfully fo
<PlainSchema id="description" mandatoryCondition="false"
multivalue="0" readonly="0" type="String" uniqueConstraint="0" anyTypeClass_id="Choreography"/>
<SyncopeSchema id="chorSpec"/>
<PlainSchema id="chorSpec" mandatoryCondition="true" mimeType="application/xml"
multivalue="0" readonly="0" type="Binary" uniqueConstraint="0" anyTypeClass_id="Choreography"/>