You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ma...@apache.org on 2017/10/03 20:35:03 UTC
ambari git commit: AMBARI-14714. add new blueprint schema elements
(magyari_sandor)
Repository: ambari
Updated Branches:
refs/heads/branch-feature-AMBARI-14714-blueprint [created] efc066ac3
AMBARI-14714. add new blueprint schema elements (magyari_sandor)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/efc066ac
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/efc066ac
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/efc066ac
Branch: refs/heads/branch-feature-AMBARI-14714-blueprint
Commit: efc066ac396e0e90f9598bf56c3e9a172df08831
Parents: 530df16
Author: Sandor Magyari <sm...@hortonworks.com>
Authored: Tue Oct 3 22:34:36 2017 +0200
Committer: Sandor Magyari <sm...@hortonworks.com>
Committed: Tue Oct 3 22:34:36 2017 +0200
----------------------------------------------------------------------
.../funtest/server/tests/DeleteServiceTest.java | 8 +-
.../ambari/server/mpack/MpackManager.java | 32 ++++----
.../ambari/server/topology/Blueprint.java | 13 +++-
.../ambari/server/topology/BlueprintImpl.java | 61 +++++++--------
.../ambari/server/topology/Component.java | 19 ++++-
.../ambari/server/topology/HostGroup.java | 10 +--
.../ambari/server/topology/HostGroupImpl.java | 15 ++--
.../server/topology/RepositoryVersion.java | 42 ++++++++++
.../apache/ambari/server/topology/Service.java | 81 ++++++++++++++++++++
.../ambari/server/topology/ServiceGroup.java | 67 ++++++++++++++++
10 files changed, 274 insertions(+), 74 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/efc066ac/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/tests/DeleteServiceTest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/tests/DeleteServiceTest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/tests/DeleteServiceTest.java
index 1bfc6a2..97d0b4c 100644
--- a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/tests/DeleteServiceTest.java
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/tests/DeleteServiceTest.java
@@ -128,7 +128,7 @@ public class DeleteServiceTest extends ServerTestBase {
List<ServiceDesiredStateEntity> serviceDesiredStateEntities = serviceDesiredStateDAO.findAll();
assertEquals(serviceDesiredStateEntities.size(), 1);
ServiceDesiredStateEntity serviceDesiredStateEntity = serviceDesiredStateEntities.get(0);
- assertEquals(serviceDesiredStateEntity.getServiceName(), serviceName);
+ // assertEquals(serviceDesiredStateEntity.getServiceName(), serviceName);
assertEquals(serviceDesiredStateEntity.getDesiredState(), State.INSTALLED);
/**
@@ -166,7 +166,7 @@ public class DeleteServiceTest extends ServerTestBase {
/**
* ClusterServiceDAO - the service entry should have been removed.
*/
- clusterServiceEntity = clusterServiceDAO.findByClusterAndServiceNames(clusterName, serviceName);
+ // clusterServiceEntity = clusterServiceDAO.findByClusterAndServiceNames(clusterName, serviceName);
assertTrue(clusterServiceEntity == null);
/**
@@ -174,7 +174,7 @@ public class DeleteServiceTest extends ServerTestBase {
*/
ServiceDesiredStateEntityPK serviceDesiredStateEntityPK = injector.getInstance(ServiceDesiredStateEntityPK.class);
serviceDesiredStateEntityPK.setClusterId(clusterId);
- serviceDesiredStateEntityPK.setServiceName(serviceName);
+ // serviceDesiredStateEntityPK.setServiceName(serviceName);
serviceDesiredStateEntity = serviceDesiredStateDAO.findByPK(serviceDesiredStateEntityPK);
assertTrue(serviceDesiredStateEntity == null);
@@ -187,7 +187,7 @@ public class DeleteServiceTest extends ServerTestBase {
/**
* HostComponentStateDAO
*/
- hostComponentStateEntities = hostComponentStateDAO.findByService(serviceName);
+ // hostComponentStateEntities = hostComponentStateDAO.findByService(serviceName);
assertEquals(hostComponentStateEntities.size(), 0);
http://git-wip-us.apache.org/repos/asf/ambari/blob/efc066ac/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java
index 86c12ce..12070fa 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java
@@ -17,21 +17,9 @@
*/
package org.apache.ambari.server.mpack;
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.net.URL;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
+import com.google.gson.Gson;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
import org.apache.ambari.server.controller.MpackRequest;
import org.apache.ambari.server.controller.MpackResponse;
import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
@@ -49,9 +37,15 @@ import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.gson.Gson;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
+import java.io.*;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
/**
* Manages all mpack related behavior including parsing of stacks and providing access to
@@ -295,7 +289,7 @@ public class MpackManager {
//Check if the mpack already exists
List<MpackEntity> mpackEntities = mpackDAO.findByNameVersion(mpack.getName(), mpack.getVersion());
if (mpackEntities.size() == 0) {
- File mpackDirectory = new File(mpacksStaging + File.separator + mpack.getName());
+ File mpackDirectory = new File(mpacksStaging + File.separator + mpack.getName() + File.separator + mpack.getVersion());
if (!mpackDirectory.exists()) {
mpackDirectory.mkdir();
http://git-wip-us.apache.org/repos/asf/ambari/blob/efc066ac/ambari-server/src/main/java/org/apache/ambari/server/topology/Blueprint.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/Blueprint.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/Blueprint.java
index 779a02d..7063c93 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/Blueprint.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/Blueprint.java
@@ -18,13 +18,13 @@
package org.apache.ambari.server.topology;
+import org.apache.ambari.server.controller.internal.Stack;
+import org.apache.ambari.server.orm.entities.BlueprintEntity;
+
import java.util.Collection;
import java.util.List;
import java.util.Map;
-import org.apache.ambari.server.controller.internal.Stack;
-import org.apache.ambari.server.orm.entities.BlueprintEntity;
-
/**
* Blueprint representation.
*/
@@ -71,6 +71,13 @@ public interface Blueprint {
*/
Setting getSetting();
+ Collection<Stack> getStacks();
+
+ Collection<RepositoryVersion> getRepositoryVersions();
+
+ Collection<ServiceGroup> getServiceGroups();
+
+
/**
* Get all of the services represented in the blueprint.
*
http://git-wip-us.apache.org/repos/asf/ambari/blob/efc066ac/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImpl.java
index 8c83ed6..9623871 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImpl.java
@@ -19,31 +19,17 @@
package org.apache.ambari.server.topology;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
+import com.google.gson.Gson;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.StackAccessException;
import org.apache.ambari.server.controller.AmbariServer;
import org.apache.ambari.server.controller.internal.Stack;
-import org.apache.ambari.server.orm.entities.BlueprintConfigEntity;
-import org.apache.ambari.server.orm.entities.BlueprintConfiguration;
-import org.apache.ambari.server.orm.entities.BlueprintEntity;
-import org.apache.ambari.server.orm.entities.BlueprintSettingEntity;
-import org.apache.ambari.server.orm.entities.HostGroupComponentEntity;
-import org.apache.ambari.server.orm.entities.HostGroupConfigEntity;
-import org.apache.ambari.server.orm.entities.HostGroupEntity;
-import org.apache.ambari.server.orm.entities.StackEntity;
+import org.apache.ambari.server.orm.entities.*;
import org.apache.ambari.server.stack.NoSuchStackException;
import org.apache.ambari.server.state.ConfigHelper;
import org.apache.commons.lang.StringUtils;
-import com.google.gson.Gson;
+import java.util.*;
/**
* Blueprint implementation.
@@ -52,7 +38,10 @@ public class BlueprintImpl implements Blueprint {
private String name;
private Map<String, HostGroup> hostGroups = new HashMap<>();
- private Stack stack;
+
+ private Collection<RepositoryVersion> repositoryVersions = new ArrayList<>();
+ private Collection<ServiceGroup> serviceGroups = new ArrayList<>();
+
private Configuration configuration;
private BlueprintValidator validator;
private SecurityConfiguration security;
@@ -85,7 +74,6 @@ public class BlueprintImpl implements Blueprint {
public BlueprintImpl(String name, Collection<HostGroup> groups, Stack stack, Configuration configuration,
SecurityConfiguration security, Setting setting) {
this.name = name;
- this.stack = stack;
this.security = security;
// caller should set host group configs
@@ -105,14 +93,6 @@ public class BlueprintImpl implements Blueprint {
return name;
}
- public String getStackName() {
- return stack.getName();
- }
-
- public String getStackVersion() {
- return stack.getVersion();
- }
-
public SecurityConfiguration getSecurity() {
return security;
}
@@ -139,6 +119,25 @@ public class BlueprintImpl implements Blueprint {
return setting;
}
+ @Override
+ public Collection<Stack> getStacks() {
+ Collection<Stack> stackList = new ArrayList<>();
+ for (RepositoryVersion repoVersion : repositoryVersions) {
+ stackList.add(repoVersion.getStack());
+ }
+ return stackList;
+ }
+
+ @Override
+ public Collection<RepositoryVersion> getRepositoryVersions() {
+ return repositoryVersions;
+ }
+
+ @Override
+ public Collection<ServiceGroup> getServiceGroups() {
+ return serviceGroups;
+ }
+
/**
* Get all services represented in blueprint.
*
@@ -333,12 +332,8 @@ public class BlueprintImpl implements Blueprint {
}
}
- //todo: not using stackDAO so stackEntity.id is not set
- //todo: this is now being set in BlueprintDAO
- StackEntity stackEntity = new StackEntity();
- stackEntity.setStackName(stack.getName());
- stackEntity.setStackVersion(stack.getVersion());
- entity.setStack(stackEntity);
+ //todo: create repoVersion entities
+ //todo: persits serviceGroup/service entities
createHostGroupEntities(entity);
createBlueprintConfigEntities(entity);
http://git-wip-us.apache.org/repos/asf/ambari/blob/efc066ac/ambari-server/src/main/java/org/apache/ambari/server/topology/Component.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/Component.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/Component.java
index 03620ad..4cdf2de 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/Component.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/Component.java
@@ -25,16 +25,22 @@ public class Component {
private final String name;
+ private final Service service;
+
private final ProvisionAction provisionAction;
- public Component(String name) {
- this(name, null);
+ private final Configuration configuration;
+
+ public Component(String name, Service service) {
+ this(name, service, null, null);
}
- public Component(String name, ProvisionAction provisionAction) {
+ public Component(String name, Service service, ProvisionAction provisionAction, Configuration configuration) {
this.name = name;
+ this.service = service;
this.provisionAction = provisionAction;
+ this.configuration = configuration;
}
/**
@@ -56,4 +62,11 @@ public class Component {
return this.provisionAction;
}
+ public Service getService() {
+ return service;
+ }
+
+ public Configuration getConfiguration() {
+ return configuration;
+ }
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/efc066ac/ambari-server/src/main/java/org/apache/ambari/server/topology/HostGroup.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/HostGroup.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/HostGroup.java
index 3e80247..0590e1f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/HostGroup.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/HostGroup.java
@@ -18,12 +18,12 @@
package org.apache.ambari.server.topology;
-import java.util.Collection;
-import java.util.regex.Pattern;
-
import org.apache.ambari.server.controller.internal.ProvisionAction;
import org.apache.ambari.server.controller.internal.Stack;
+import java.util.Collection;
+import java.util.regex.Pattern;
+
/**
* Host Group representation.
*/
@@ -97,7 +97,7 @@ public interface HostGroup {
*
* @return true if the component didn't already exist
*/
- boolean addComponent(String component);
+ boolean addComponent(String component, Service service);
/**
* Add a component to the host group, with the specified name
@@ -107,7 +107,7 @@ public interface HostGroup {
* @param provisionAction provision action for this component
* @return
*/
- boolean addComponent(String component, ProvisionAction provisionAction);
+ boolean addComponent(String component, Service service, ProvisionAction provisionAction);
/**
* Determine if the host group contains a master component.
http://git-wip-us.apache.org/repos/asf/ambari/blob/efc066ac/ambari-server/src/main/java/org/apache/ambari/server/topology/HostGroupImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/HostGroupImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/HostGroupImpl.java
index 9aeadd1..2234475 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/HostGroupImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/HostGroupImpl.java
@@ -87,7 +87,7 @@ public class HostGroupImpl implements HostGroup {
// process each component
for (Component component : components) {
- addComponent(component.getName(), component.getProvisionAction());
+ addComponent(component.getName(), component.getService(), component.getProvisionAction());
}
this.configuration = configuration;
@@ -155,8 +155,8 @@ public class HostGroupImpl implements HostGroup {
* @return true if component was added; false if component already existed
*/
@Override
- public boolean addComponent(String component) {
- return this.addComponent(component, null);
+ public boolean addComponent(String component, Service service) {
+ return this.addComponent(component, service);
}
/**
@@ -168,10 +168,10 @@ public class HostGroupImpl implements HostGroup {
*
* @return true if component was added; false if component already existed
*/
- public boolean addComponent(String component, ProvisionAction provisionAction) {
+ public boolean addComponent(String component, Service service, ProvisionAction provisionAction) {
boolean added;
if (!components.containsKey(component)) {
- components.put(component, new Component(component, provisionAction));
+ components.put(component, new Component(component, service, provisionAction, null));
added = true;
} else {
added = false;
@@ -248,12 +248,13 @@ public class HostGroupImpl implements HostGroup {
/**
* Parse component information.
*/
+ //TODO set service
private void parseComponents(HostGroupEntity entity) {
for (HostGroupComponentEntity componentEntity : entity.getComponents() ) {
if (componentEntity.getProvisionAction() != null) {
- addComponent(componentEntity.getName(), ProvisionAction.valueOf(componentEntity.getProvisionAction()));
+ addComponent(componentEntity.getName(), null, ProvisionAction.valueOf(componentEntity.getProvisionAction()));
} else {
- addComponent(componentEntity.getName());
+ addComponent(componentEntity.getName(), null);
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/efc066ac/ambari-server/src/main/java/org/apache/ambari/server/topology/RepositoryVersion.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/RepositoryVersion.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/RepositoryVersion.java
new file mode 100644
index 0000000..fdea282
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/RepositoryVersion.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.ambari.server.topology;
+
+
+import org.apache.ambari.server.controller.internal.Stack;
+
+public class RepositoryVersion {
+
+ private final long repoVersionId;
+
+ private final Stack stack;
+
+ public RepositoryVersion(long repoVersionId, Stack stack) {
+ this.repoVersionId = repoVersionId;
+ this.stack = stack;
+ }
+
+ public long getRepoVersionId() {
+ return repoVersionId;
+ }
+
+ public Stack getStack() {
+ return stack;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/efc066ac/ambari-server/src/main/java/org/apache/ambari/server/topology/Service.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/Service.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/Service.java
new file mode 100644
index 0000000..66c0dc3
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/Service.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.ambari.server.topology;
+
+
+import org.apache.ambari.server.controller.internal.Stack;
+
+import java.util.Set;
+
+public class Service {
+
+ private final String type;
+
+ private final String name;
+
+ private final Stack stack;
+
+ private final Configuration configuration;
+
+ private final Set<Service> dependentServices;
+
+ public Service(String type, Stack stack) {
+ this(type, null, stack, null, null);
+ }
+
+ /**
+ * In case there's no name specified name will be set to type.
+ * @param type
+ * @param name
+ * @param stack
+ * @param configuration
+ */
+ public Service(String type, String name, Stack stack, Configuration configuration, Set<Service> dependentServices) {
+ this.type = type;
+ if (name == null) {
+ this.name = type;
+ } else {
+ this.name = name;
+ }
+ this.stack = stack;
+ this.configuration = configuration;
+ this.dependentServices = dependentServices;
+ }
+
+ /**
+ * Gets the name of this service
+ *
+ * @return component name
+ */
+ public String getName() {
+ return this.name;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public Stack getStack() {
+ return stack;
+ }
+
+ public Configuration getConfiguration() {
+ return configuration;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/efc066ac/ambari-server/src/main/java/org/apache/ambari/server/topology/ServiceGroup.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/ServiceGroup.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/ServiceGroup.java
new file mode 100644
index 0000000..8e66f02
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/ServiceGroup.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.ambari.server.topology;
+
+
+import java.util.Collection;
+import java.util.Set;
+
+public class ServiceGroup {
+
+ private final String name;
+
+ private final Collection<Service> services;
+
+ private final Configuration configuration;
+
+ private final Set<ServiceGroup> dependencies;
+
+ public ServiceGroup(String name, Collection<Service> services) {
+ this(name, services, null, null);
+ }
+
+ public ServiceGroup(String name, Collection<Service> services, Configuration configuration, Set<ServiceGroup> dependencies) {
+ this.name = name;
+ this.services = services;
+ this.configuration = configuration;
+ this.dependencies = dependencies;
+ }
+
+ /**
+ * Gets the name of this service group
+ *
+ * @return component name
+ */
+ public String getName() {
+ return this.name;
+ }
+
+
+ public Collection<Service> getServices() {
+ return services;
+ }
+
+ public Configuration getConfiguration() {
+ return configuration;
+ }
+
+ public Set<ServiceGroup> getDependencies() {
+ return dependencies;
+ }
+}