--- /dev/null
+.settings
+.project
+.classpath
+.checkstyle
+target/
+**/logs/
+**/debug-logs/
+/.pydevproject
+/bin/
+appconfig-local/
+**/.idea/
+*/.idea
+*.iml
+.idea/
---
project: 'aai-babel'
project_creation_date: '2017-07-14'
+project_category: ''
lifecycle_state: 'Incubation'
-project_lead: &onap_releng_ptl
+project_lead: &onap_aai_ptl
name: 'James Forsyth'
email: 'jf2512@att.com'
id: 'jimmydot'
company: 'ATT'
timezone: 'America/Detroit'
-primary_contact: *onap_releng_ptl
+primary_contact: *onap_aai_ptl
issue_tracking:
type: 'jira'
url: 'https://jira.onap.org/projects/AAI'
key: 'AAI'
+mailing_list:
+ type: 'groups.io'
+ url: 'lists.onap.org'
+ tag: '<[sub-project_name]>'
+realtime_discussion: ''
meetings:
- type: 'zoom'
agenda: 'https://wiki.onap.org/display/DW/AAI+Meeting+Notes'
channel: 'n/a'
repeats: 'weekly'
time: '14:00 UTC'
+repositories:
+ - 'aai-aai-common'
+ - 'aai-aai-config'
+ - 'aai-aai-data'
+ - 'aai-aai-service'
+ - 'aai-babel'
+ - 'aai-cacher'
+ - 'aai-chameleon'
+ - 'aai-champ'
+ - 'aai-data-router'
+ - 'aai-eis'
+ - 'aai-enricher'
+ - 'aai-event-client'
+ - 'aai-gallifrey'
+ - 'aai-gap'
+ - 'aai-gizmo'
+ - 'aai-graphadmin'
+ - 'aai-graphgraph'
+ - 'aai-logging-service'
+ - 'aai-model-loader'
+ - 'aai-oom'
+ - 'aai-resources'
+ - 'aai-rest-client'
+ - 'aai-router-core'
+ - 'aai-schema-service'
+ - 'aai-search-data-service'
+ - 'aai-sparky-be'
+ - 'aai-sparky-fe'
+ - 'aai-spike'
+ - 'aai-tabular-data-service'
+ - 'aai-test-config'
+ - 'aai-traversal'
+ - 'aai-validation'
committers:
- - <<: *onap_releng_ptl
+ - <<: *onap_aai_ptl
- name: 'Manisha Aggarwal'
email: 'ma9181@att.com'
company: 'ATT'
id: 'ma9181'
- timezone: 'America/New York'
+ timezone: 'America/New_York'
- name: 'Steven Blimkie'
email: 'Steven.Blimkie@amdocs.com'
company: 'Amdocs'
email: 'vk250x@att.com'
company: 'ATT'
id: 'vk250x'
- timezone: 'America/New York'
+ timezone: 'America/New_York'
tsc:
approval: 'https://lists.onap.org/pipermail/onap-tsc'
changes:
============LICENSE_START=======================================================
org.onap.aai
================================================================================
-Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
-Copyright © 2017-2018 European Software Marketing Ltd.
+Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+Copyright (c) 2017-2019 European Software Marketing Ltd.
================================================================================
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
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.
-============LICENSE_END=========================================================
\ No newline at end of file
+============LICENSE_END=========================================================
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.auth;
public class AAIAuthException extends Exception {
- /** */
+
private static final long serialVersionUID = 1L;
public AAIAuthException(String string) {
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.auth;
import com.fasterxml.jackson.core.JsonProcessingException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import java.util.Map.Entry;
+import java.util.Optional;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
private static LogHelper applicationLogger = LogHelper.INSTANCE;
- private static final String CONFIG_HOME = System.getProperty("CONFIG_HOME");
-
- public static final String FILESEP =
- (System.getProperty("file.separator") == null) ? "/" : System.getProperty("file.separator");
- public static final String APPCONFIG_DIR =
- (CONFIG_HOME == null) ? System.getProperty("APP_HOME") + FILESEP + "appconfig" : CONFIG_HOME;
-
- private static String appConfigAuthDir = APPCONFIG_DIR + FILESEP + "auth";
- private static String defaultAuthFileName = appConfigAuthDir + FILESEP + "auth_policy.json";
+ /**
+ * The default policy file is expected to be located in either one of
+ * <ul>
+ * <li><code>$CONFIG_HOME/auth_policy.json</code></li>
+ * <li><code>$CONFIG_HOME/auth/auth_policy.json</code></li>
+ * <p>
+ * Note that if <code>CONFIG_HOME</code> is not set then assume it has a value of <code>$APP_HOME/appconfig</code>
+ */
+ private static String defaultAuthFileName = "auth_policy.json";
private static boolean usersInitialized = false;
private static HashMap<String, AAIAuthUser> users;
private static String policyAuthFileName;
public enum HTTP_METHODS {
- GET,
- PUT,
- DELETE,
- HEAD,
- POST
+ GET, PUT, DELETE, HEAD, POST
}
// Don't instantiate
applicationLogger.error(ApplicationMsgs.PROCESS_REQUEST_ERROR, e);
throw new AAIAuthException(e.getMessage());
}
+
if (policyAuthFileName == null) {
- throw new AAIAuthException("Auth policy file could not be found" + CONFIG_HOME + APPCONFIG_DIR);
+ throw new AAIAuthException("Auth policy file could not be found");
}
AAIMicroServiceAuthCore.reloadUsers();
}
public static String getConfigFile(String authPolicyFile) throws IOException {
- File authFile = new File(authPolicyFile);
- if (authFile.exists()) {
- return authFile.getCanonicalPath();
- }
- authFile = new File(appConfigAuthDir + FILESEP + authPolicyFile);
- if (authFile.exists()) {
- return authFile.getCanonicalPath();
- }
- if (defaultAuthFileName != null) {
- authFile = new File(defaultAuthFileName);
- if (authFile.exists()) {
- return defaultAuthFileName;
+ return locateConfigFile(authPolicyFile).orElse(locateConfigFile(defaultAuthFileName).orElse(null));
+ }
+
+ /**
+ * Locate the auth policy file by its name or path.
+ * <ul>
+ * <li>First try to use the absolute path to the file (if provided), or instead locate the path relative to the
+ * current (or user) dir.</li>
+ * <li>If this fails, try resolving the path relative to the configuration home location (either
+ * <code>$CONFIG_HOME</code> or <code>$APP_HOME/appconfig</code>).</li>
+ * <li>If this fails try resolving relative to the <code>auth</code> folder under configuration home.</li>
+ *
+ * @param authPolicyFile
+ * filename or path
+ * @return the Optional canonical path to the located policy file
+ * @throws IOException
+ * if the construction of the canonical pathname requires filesystem queries which cause I/O error(s)
+ */
+ private static Optional<String> locateConfigFile(String authPolicyFile) throws IOException {
+ if (authPolicyFile != null) {
+ List<Path> paths = new ArrayList<>();
+ paths.add(Paths.get("."));
+
+ String configHome = System.getProperty("CONFIG_HOME");
+ if (configHome == null) {
+ configHome = System.getProperty("APP_HOME") + "/appconfig";
+ }
+
+ paths.add(Paths.get(configHome));
+ paths.add(Paths.get(configHome).resolve("auth"));
+
+ for (Path path : paths) {
+ File authFile = path.resolve(authPolicyFile).toFile();
+ if (authFile.exists()) {
+ return Optional.of(authFile.getCanonicalPath());
+ }
}
}
- return null;
+
+ return Optional.empty();
}
public static synchronized void reloadUsers() throws AAIAuthException {
user = new AAIAuthUser();
}
applicationLogger.debug("Assigning " + roleName + " to user " + name);
- user.setUser(name);
user.addRole(roleName, r);
users.put(name, user);
}
}
public static class AAIAuthUser {
- private String username;
private HashMap<String, AAIAuthRole> roles;
public AAIAuthUser() {
this.roles = new HashMap<>();
}
- public String getUser() {
- return this.username;
- }
-
- public Map<String, AAIAuthRole> getRoles() {
- return this.roles;
- }
-
public void addRole(String roleName, AAIAuthRole r) {
this.roles.put(roleName, r);
}
}
return false;
}
-
- public void setUser(String myuser) {
- this.username = myuser;
- }
}
public static class AAIAuthRole {
this.allowedFunctions.add(func);
}
- public void delAllowedFunction(String delFunc) {
- if (this.allowedFunctions.contains(delFunc)) {
- this.allowedFunctions.remove(delFunc);
- }
- }
-
public boolean hasAllowedFunction(String afunc) {
return this.allowedFunctions.contains(afunc);
}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.auth;
import java.io.File;
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.babel;
import java.util.HashMap;
import org.eclipse.jetty.util.security.Password;
+import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
+import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ImportResource;
@SpringBootApplication
@ImportResource("classpath:babel-beans.xml")
public class BabelApplication extends SpringBootServletInitializer {
- private static final String OBFS_PATTERN = "OBF:";
+ private static ConfigurableApplicationContext context;
/**
* Spring Boot Initialization.
*
- * @param args main args
+ * @param args
+ * main args
*/
public static void main(String[] args) {
String keyStorePassword = System.getProperty("KEY_STORE_PASSWORD");
throw new IllegalArgumentException("Env property KEY_STORE_PASSWORD not set");
}
HashMap<String, Object> props = new HashMap<>();
- String decryptedValue = keyStorePassword.startsWith(OBFS_PATTERN)? Password.deobfuscate(keyStorePassword) : keyStorePassword;
+ String decryptedValue = keyStorePassword.startsWith(Password.__OBFUSCATE) ? //
+ Password.deobfuscate(keyStorePassword) : keyStorePassword;
props.put("server.ssl.key-store-password", decryptedValue);
String requireClientAuth = System.getenv("REQUIRE_CLIENT_AUTH");
props.put("server.ssl.client-auth",
Boolean.FALSE.toString().equalsIgnoreCase(requireClientAuth) ? "want" : "need");
- new BabelApplication().configure(new SpringApplicationBuilder(BabelApplication.class).properties(props))
- .run(args);
+ context = new BabelApplication()
+ .configure(new SpringApplicationBuilder(BabelApplication.class).properties(props)).run(args);
+ }
+
+ public static void exit() {
+ SpringApplication.exit(context);
}
}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2018 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.babel.config;
import org.springframework.beans.factory.annotation.Value;
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.babel.csar;
import java.util.List;
* the name of the archive file
* @param version
* the version of the archive file
- * @return List<org.onap.sdc.generator.data.Artifact> a list of generated XML artifacts
+ * @return a list of generated XML artifacts
* @throws CsarConverterException
* if there is an error either extracting the YAML files or generating XML artifacts
*/
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.babel.csar.vnfcatalog;
import com.google.gson.annotations.SerializedName;
this.applicationVersion = applicationVersion;
}
- public String getApplication() {
- return application;
- }
-
- public void setApplication(String application) {
- this.application = application;
- }
-
- public String getApplicationVendor() {
- return applicationVendor;
- }
-
- public void setApplicationVendor(String applicationVendor) {
- this.applicationVendor = applicationVendor;
- }
-
- public String getApplicationVersion() {
- return applicationVersion;
- }
-
- public void setApplicationVersion(String applicationVersion) {
- this.applicationVersion = applicationVersion;
- }
-
@Override
public String toString() {
return "VendorImage [" + application + ", " + applicationVendor + ", " + applicationVersion + "]";
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
package org.onap.aai.babel.parser;
import com.google.gson.Gson;
+import com.google.gson.JsonSyntaxException;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.onap.aai.babel.logging.LogHelper;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
import org.onap.aai.babel.xml.generator.data.GroupConfiguration;
import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil;
import org.onap.aai.babel.xml.generator.model.Model;
import org.onap.aai.babel.xml.generator.model.Resource;
import org.onap.aai.babel.xml.generator.model.Widget;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
+import org.onap.aai.babel.xml.generator.model.WidgetType;
+import org.onap.aai.babel.xml.generator.types.ModelType;
import org.onap.aai.cl.api.Logger;
import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
import org.onap.sdc.toscaparser.api.Group;
}
/**
- * Get or create the artifact description.
- *
- * @param model
- * the artifact model
- * @return the artifact model's description
- */
- public static String getArtifactDescription(Model model) {
- switch (model.getModelType()) {
- case SERVICE:
- return "AAI Service Model";
- case RESOURCE:
- return "AAI Resource Model";
- default:
- return model.getModelDescription();
- }
- }
-
- /**
- * Initialises the widget configuration.
- *
+ * Initializes the Widget to UUID mapping configuration.
+ *
* @throws IOException
+ * if an error occurs reading the configuration properties
*/
public static void initWidgetConfiguration() throws IOException {
log.debug("Getting Widget Configuration");
}
/**
- * Initialises the group filtering and TOSCA mapping configuration.
+ * Initializes the group filtering and TOSCA to Widget mapping configuration.
*
* @param configLocation
- * the pathname to the JSON config file
- * @throws FileNotFoundException
- * if the file cannot be opened for reading
+ * the pathname to the JSON mappings file
+ * @throws IOException
+ * if the file content could not be read successfully
*/
- public static void initToscaMappingsConfiguration(String configLocation) throws FileNotFoundException {
+ public static void initToscaMappingsConfiguration(String configLocation) throws IOException {
log.debug("Getting TOSCA Mappings Configuration");
File file = new File(configLocation);
if (!file.exists()) {
throw new IllegalArgumentException(String.format(GENERATOR_AAI_CONFIGFILE_NOT_FOUND, configLocation));
}
- BufferedReader bufferedReader = new BufferedReader(new FileReader(configLocation));
- GroupConfiguration config = new Gson().fromJson(bufferedReader, GroupConfiguration.class);
- if (config != null) {
- WidgetConfigurationUtil.setSupportedInstanceGroups(config.getInstanceGroupTypes());
- WidgetConfigurationUtil.setWidgetMappings(config.getWidgetMappings());
+ GroupConfiguration config;
+
+ try (BufferedReader bufferedReader = new BufferedReader(new FileReader(configLocation))) {
+ config = new Gson().fromJson(bufferedReader, GroupConfiguration.class);
+ } catch (JsonSyntaxException e) {
+ throw new IOException("Invalid Mappings Configuration " + configLocation, e);
+ }
+
+ if (config == null) {
+ throw new IOException("There is no content for the Mappings Configuration " + configLocation);
}
+
+ WidgetConfigurationUtil.setSupportedInstanceGroups(config.getInstanceGroupTypes());
+ WidgetConfigurationUtil.setWidgetTypes(config.getWidgetTypes());
+ WidgetConfigurationUtil.setWidgetMappings(config.getWidgetMappings());
}
/**
* @param resourceModel
* @param serviceNodeTemplate
* @return resources for which XML Models should be generated
+ * @throws XmlArtifactGenerationException
+ * if there is no configuration defined for a member Widget of an instance group
*/
- public List<Resource> processInstanceGroups(Model resourceModel, NodeTemplate serviceNodeTemplate) {
+ public List<Resource> processInstanceGroups(Model resourceModel, NodeTemplate serviceNodeTemplate)
+ throws XmlArtifactGenerationException {
List<Resource> resources = new ArrayList<>();
if (serviceNodeTemplate.getSubMappingToscaTemplate() != null) {
List<Group> serviceGroups = csarHelper.getGroupsOfOriginOfNodeTemplate(serviceNodeTemplate);
}
public Resource createInstanceGroupModel(Map<String, String> properties) {
- Resource groupModel = new Resource(Type.INSTANCE_GROUP, true);
+ Resource groupModel = new Resource(WidgetType.valueOf("INSTANCE_GROUP"), true);
groupModel.populateModelIdentificationInformation(properties);
return groupModel;
}
/**
+ * Add the resource/widget to the specified model.
+ *
* @param model
* @param relation
+ * resource or widget model to add
+ * @throws XmlArtifactGenerationException
+ * if the relation is a widget and there is no configuration defined for the relation's widget type
*/
- public void addRelatedModel(final Model model, final Resource relation) {
- if (relation.isResource()) {
+ public void addRelatedModel(final Model model, final Resource relation) throws XmlArtifactGenerationException {
+ if (relation.getModelType() == ModelType.RESOURCE) {
model.addResource(relation);
} else {
model.addWidget(Widget.getWidget(relation.getWidgetType()));
* @param resources
* @param model
* @param serviceNode
+ * @throws XmlArtifactGenerationException
*/
- public void processVfModules(List<Resource> resources, Model resourceModel, NodeTemplate serviceNode) {
+ public void processVfModules(List<Resource> resources, Model resourceModel, NodeTemplate serviceNode)
+ throws XmlArtifactGenerationException {
// Get the customisation UUID for each VF node and use it to get its Groups
String uuid = csarHelper.getNodeTemplateCustomizationUuid(serviceNode);
List<Group> serviceGroups = csarHelper.getVfModulesByVf(uuid);
// Process each VF Group
for (Group serviceGroup : serviceGroups) {
Model groupModel = Model.getModelFor(serviceGroup.getType());
- if (groupModel.getWidgetType() == Type.VFMODULE) {
+ if (groupModel.getWidgetType() == WidgetType.valueOf("VFMODULE")) {
processVfModule(resources, resourceModel, serviceGroup, serviceNode, (Resource) groupModel);
}
}
String metaDataType = Optional.ofNullable(metadata).map(m -> m.getValue("type")).orElse(nodeTypeName);
Resource model = Model.getModelFor(nodeTypeName, metaDataType);
- if (metadata != null && hasAllottedResource(metadata.getAllProperties())) {
- if (model.getWidgetType() == Type.VSERVER) {
- model = new Resource(Type.ALLOTTED_RESOURCE, false);
- Map<String, Object> props = new HashMap<>();
- props.put("providingService", true);
- model.setProperties(props);
- }
+ if (metadata != null && hasAllottedResource(metadata.getAllProperties())
+ && model.getWidgetType() == WidgetType.valueOf("VSERVER")) {
+ model = new Resource(WidgetType.valueOf("ALLOTTED_RESOURCE"), false);
+ Map<String, Object> props = new HashMap<>();
+ props.put("providingService", true);
+ model.setProperties(props);
}
foundProvidingService |= processModel(resourceModel, metadata, model, resourceNodeTemplate.getProperties());
}
- if (resourceModel.getWidgetType() == Type.ALLOTTED_RESOURCE && !foundProvidingService) {
+ if (resourceModel.getWidgetType() == WidgetType.valueOf("ALLOTTED_RESOURCE") && !foundProvidingService) {
final String modelInvariantId = resourceModel.getModelId();
throw new IllegalArgumentException(String.format(GENERATOR_AAI_PROVIDING_SERVICE_MISSING,
modelInvariantId == null ? "<null ID>" : modelInvariantId));
* @param properties
* the properties of the Group
* @return the Instance Group and Member resource models
+ * @throws XmlArtifactGenerationException
+ * if there is no configuration defined for one of the member Widgets
*/
private List<Resource> processInstanceGroup(Model resourceModel, ArrayList<NodeTemplate> memberNodes,
- Map<String, String> metaProperties, Map<String, Property> properties) {
+ Map<String, String> metaProperties, Map<String, Property> properties)
+ throws XmlArtifactGenerationException {
Resource groupModel = createInstanceGroupModel(mergeProperties(metaProperties, properties));
resourceModel.addResource(groupModel);
List<Resource> resources = Stream.of(groupModel).collect(Collectors.toList());
/**
* @param memberNodes
* @param groupModel
- * @return
+ * @return a list of Resources
+ * @throws XmlArtifactGenerationException
+ * if a member node template is a widget and there is no configuration defined for that relation's
+ * widget type
*/
private List<Resource> generateResourcesAndWidgets(final ArrayList<NodeTemplate> memberNodes,
- final Resource groupModel) {
+ final Resource groupModel) throws XmlArtifactGenerationException {
log.debug(String.format("Processing member nodes for Group %s (invariant UUID %s)", //
groupModel.getModelName(), groupModel.getModelId()));
memberModel.getClass().getSuperclass().getSimpleName(), memberModel.getClass(), nodeTypeName));
addRelatedModel(groupModel, memberModel);
- if (memberModel.isResource()) {
+ if (memberModel.getModelType() == ModelType.RESOURCE) {
resources.add(memberModel);
}
}
}
private void processVfModule(List<Resource> resources, Model vfModel, Group groupDefinition,
- NodeTemplate serviceNode, Resource groupModel) {
+ NodeTemplate serviceNode, Resource groupModel) throws XmlArtifactGenerationException {
groupModel.populateModelIdentificationInformation(
mergeProperties(groupDefinition.getMetadata().getAllProperties(), groupDefinition.getProperties()));
}
}
- private void processVfModuleGroup(Resource groupModel, List<NodeTemplate> members) {
+ private void processVfModuleGroup(Resource groupModel, List<NodeTemplate> members)
+ throws XmlArtifactGenerationException {
if (members != null && !members.isEmpty()) {
// Get names of the members of the service group
List<String> memberNames = members.stream().map(NodeTemplate::getName).collect(Collectors.toList());
*
* @param group
* @param member
+ * @throws XmlArtifactGenerationException
*/
- private void processGroupMembers(Resource group, NodeTemplate member) {
+ private void processGroupMembers(Resource group, NodeTemplate member) throws XmlArtifactGenerationException {
Resource resource = Model.getModelFor(member.getType());
log.debug(member.getType() + " mapped to " + resource);
- if (resource.getWidgetType() == Type.L3_NET) {
+ if (resource.getWidgetType() == WidgetType.valueOf("L3_NET")) {
// An l3-network inside a vf-module is treated as a Widget
- resource.setIsResource(false);
+ resource.setModelType(ModelType.WIDGET);
}
- if (!resource.isResource()) {
+ if (resource.getModelType() == ModelType.WIDGET) {
Widget widget = Widget.getWidget(resource.getWidgetType());
widget.addKey(member.getName());
// Add the widget element encountered to the Group model
if (foundProvidingService) {
processProvidingService(resourceModel, resourceNode, nodeProperties);
- } else if (resourceNode != null && resourceNode.isResource()
- && resourceNode.getWidgetType() != Widget.Type.L3_NET) {
+ } else if (resourceNode != null && resourceNode.getModelType() == ModelType.RESOURCE
+ && resourceNode.getWidgetType() != WidgetType.valueOf("L3_NET")) {
if (metaData != null) {
resourceNode.populateModelIdentificationInformation(metaData.getAllProperties());
}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.babel.service;
import com.google.gson.Gson;
private AAIMicroServiceAuth aaiMicroServiceAuth;
- /** @param authorization */
+ /**
+ * @param authorization
+ */
@Inject
public GenerateArtifactsServiceImpl(final AAIMicroServiceAuth authorization) {
this.aaiMicroServiceAuth = authorization;
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.babel.service.data;
/** Bean representing the return artifacts of the Babel microservice. */
public class BabelArtifact {
public enum ArtifactType {
- MODEL,
- VNFCATALOG;
+ MODEL, VNFCATALOG;
}
String name;
return name;
}
- public void setName(String name) {
- this.name = name;
- }
-
public ArtifactType getType() {
return type;
}
- public void setType(String type) {
- this.type = ArtifactType.valueOf(type);
- }
-
public String getPayload() {
return payload;
}
-
- public void setPayload(String payload) {
- this.payload = payload;
- }
}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import org.onap.aai.babel.logging.ApplicationMsgs;
import org.onap.aai.babel.logging.LogHelper;
import org.onap.aai.babel.parser.ArtifactGeneratorToscaParser;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
import org.onap.aai.babel.xml.generator.data.AdditionalParams;
import org.onap.aai.babel.xml.generator.data.Artifact;
import org.onap.aai.babel.xml.generator.data.ArtifactType;
import org.onap.aai.babel.xml.generator.model.Model;
import org.onap.aai.babel.xml.generator.model.Resource;
import org.onap.aai.babel.xml.generator.model.Service;
-import org.onap.aai.babel.xml.generator.model.TunnelXconnectWidget;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
+import org.onap.aai.babel.xml.generator.model.WidgetType;
+import org.onap.aai.babel.xml.generator.model.Widget;
+import org.onap.aai.babel.xml.generator.types.ModelType;
import org.onap.aai.cl.api.Logger;
import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
+import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException;
import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory;
import org.onap.sdc.toscaparser.api.Group;
import org.onap.sdc.toscaparser.api.NodeTemplate;
private static final String GENERATOR_AAI_INVALID_SERVICE_VERSION =
"Cannot generate artifacts. Service version is incorrect";
- private AaiModelGenerator modelGenerator = new AaiModelGeneratorImpl();
+ private AaiModelGenerator modelGenerator = new AaiModelGenerator();
@Override
public GenerationData generateArtifact(byte[] csarArchive, List<Artifact> input,
Map<String, String> additionalParams) {
- Path csarPath;
-
- try {
- csarPath = createTempFile(csarArchive);
- } catch (IOException e) {
- log.error(ApplicationMsgs.TEMP_FILE_ERROR, e);
- return createErrorData(e);
- }
-
String configLocation = System.getProperty(ArtifactGeneratorToscaParser.PROPERTY_TOSCA_MAPPING_FILE);
if (configLocation == null) {
throw new IllegalArgumentException(
try {
ArtifactGeneratorToscaParser.initWidgetConfiguration();
ArtifactGeneratorToscaParser.initToscaMappingsConfiguration(configLocation);
+ } catch (IOException e) {
+ log.error(ApplicationMsgs.LOAD_PROPERTIES, e, configLocation);
+ return createErrorData(e);
+ }
+
+ Path csarPath;
+
+ try {
+ csarPath = createTempFile(csarArchive);
+ } catch (IOException e) {
+ log.error(ApplicationMsgs.TEMP_FILE_ERROR, e);
+ return createErrorData(e);
+ }
+
+ try {
ISdcCsarHelper csarHelper =
SdcToscaParserFactory.getInstance().getSdcCsarHelper(csarPath.toAbsolutePath().toString());
return generateAllArtifacts(validateServiceVersion(additionalParams), csarHelper);
- } catch (Exception e) {
+ } catch (SdcToscaParserException | XmlArtifactGenerationException e) {
log.error(ApplicationMsgs.INVALID_CSAR_FILE, e);
return createErrorData(e);
} finally {
* @param csarHelper
* interface to the TOSCA parser
* @return the generated Artifacts (containing XML models)
+ * @throws XmlArtifactGenerationException
*/
- private GenerationData generateAllArtifacts(final String serviceVersion, ISdcCsarHelper csarHelper) {
+ private GenerationData generateAllArtifacts(final String serviceVersion, ISdcCsarHelper csarHelper)
+ throws XmlArtifactGenerationException {
List<NodeTemplate> serviceNodeTemplates = csarHelper.getServiceNodeTemplates();
if (serviceNodeTemplates == null) {
throw new IllegalArgumentException(GENERATOR_AAI_ERROR_MISSING_SERVICE_TOSCA);
* @param serviceNodeTemplates
* @param serviceModel
* @return the generated Models
+ * @throws XmlArtifactGenerationException
*/
private List<Resource> generateResourceModels(ISdcCsarHelper csarHelper, List<NodeTemplate> serviceNodeTemplates,
- Service serviceModel) {
+ Service serviceModel) throws XmlArtifactGenerationException {
final List<Group> serviceGroups = csarHelper.getGroupsOfTopologyTemplate();
final ArtifactGeneratorToscaParser parser = new ArtifactGeneratorToscaParser(csarHelper);
private void generateModelFromNodeTemplate(ISdcCsarHelper csarHelper, Service serviceModel,
List<Resource> resources, final List<Group> serviceGroups, ArtifactGeneratorToscaParser parser,
- NodeTemplate nodeTemplate) {
+ NodeTemplate nodeTemplate) throws XmlArtifactGenerationException {
Resource model = getModelFor(parser, nodeTemplate);
if (model != null) {
}
parser.addRelatedModel(serviceModel, model);
- if (model.isResource()) {
+ if (model.getModelType() == ModelType.RESOURCE) {
generateResourceModel(csarHelper, resources, parser, nodeTemplate);
}
} else {
if (model != null) {
Metadata metadata = nodeTemplate.getMetaData();
- if (metadata != null && parser.hasAllottedResource(metadata.getAllProperties())) {
- if (model.getWidgetType() == Type.VF) {
- model = new Resource(Type.ALLOTTED_RESOURCE, true);
- }
+ if (metadata != null && parser.hasAllottedResource(metadata.getAllProperties())
+ && model.getWidgetType() == WidgetType.valueOf("VF")) {
+ model = new Resource(WidgetType.valueOf("ALLOTTED_RESOURCE"), true);
}
}
}
private void generateResourceModel(ISdcCsarHelper csarHelper, List<Resource> resources,
- ArtifactGeneratorToscaParser parser, NodeTemplate nodeTemplate) {
+ ArtifactGeneratorToscaParser parser, NodeTemplate nodeTemplate) throws XmlArtifactGenerationException {
Resource resourceModel = getModelFor(parser, nodeTemplate);
+ if (resourceModel == null) {
+ log.info(ApplicationMsgs.DISTRIBUTION_EVENT, "Could not generate resource model");
+ return;
+ }
+
Map<String, String> serviceMetadata = nodeTemplate.getMetaData().getAllProperties();
resourceModel.populateModelIdentificationInformation(serviceMetadata);
}
if (parser.hasSubCategoryTunnelXConnect(serviceMetadata) && parser.hasAllottedResource(serviceMetadata)) {
- resourceModel.addWidget(new TunnelXconnectWidget());
+ resourceModel.addWidget(Widget.getWidget(WidgetType.valueOf("TUNNEL_XCONNECT")));
}
resources.addAll(parser.processInstanceGroups(resourceModel, nodeTemplate));
/**
* @param generationData
* @param resource
+ * @throws XmlArtifactGenerationException
*/
- private void generateResourceArtifact(GenerationData generationData, Resource resource) {
+ private void generateResourceArtifact(GenerationData generationData, Resource resource)
+ throws XmlArtifactGenerationException {
if (!isContained(generationData, getArtifactName(resource))) {
log.info(ApplicationMsgs.DISTRIBUTION_EVENT, "Generating resource model");
generationData.add(getResourceArtifact(resource, modelGenerator.generateModelFor(resource)));
private String getArtifactLabel(Model model) {
StringBuilder artifactName = new StringBuilder(ArtifactType.AAI.name());
artifactName.append("-");
- artifactName.append(model.getModelType().name().toLowerCase());
+ artifactName.append(model.getModelTypeName());
artifactName.append("-");
artifactName.append(hashCodeUuId(model.getModelNameVersionId()));
return (artifactName.toString()).replaceAll("[^a-zA-Z0-9 +]+", "-");
artifactName.append(truncatedArtifactName);
artifactName.append("-");
- artifactName.append(model.getModelType().name().toLowerCase());
+ artifactName.append(model.getModelTypeName());
artifactName.append("-");
artifactName.append(model.getModelVersion());
* AAI model as string
* @return Generated {@link Artifact} model for the resource
*/
- private Artifact getResourceArtifact(Model resourceModel, String aaiResourceModel) {
+ private Artifact getResourceArtifact(Resource resourceModel, String aaiResourceModel) {
final String resourceArtifactLabel = getArtifactLabel(resourceModel);
MDC.put(MDC_PARAM_MODEL_INFO, resourceModel.getModelName() + "," + resourceArtifactLabel);
final byte[] bytes = aaiResourceModel.getBytes();
GeneratorUtil.checkSum(bytes), GeneratorUtil.encode(bytes));
artifact.setName(getArtifactName(resourceModel));
artifact.setLabel(resourceArtifactLabel);
- artifact.setDescription(ArtifactGeneratorToscaParser.getArtifactDescription(resourceModel));
+ artifact.setDescription("AAI Resource Model");
return artifact;
}
String serviceArtifactLabel = getArtifactLabel(serviceModel);
artifact.setName(serviceArtifactName);
artifact.setLabel(serviceArtifactLabel);
- String description = ArtifactGeneratorToscaParser.getArtifactDescription(serviceModel);
- artifact.setDescription(description);
+ artifact.setDescription("AAI Service Model");
return artifact;
}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.babel.xml.generator.api;
+import java.io.StringWriter;
+import java.util.Collection;
+import java.util.List;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import org.onap.aai.babel.logging.ApplicationMsgs;
+import org.onap.aai.babel.logging.LogHelper;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
+import org.onap.aai.babel.xml.generator.model.Model;
import org.onap.aai.babel.xml.generator.model.Resource;
import org.onap.aai.babel.xml.generator.model.Service;
+import org.onap.aai.babel.xml.generator.model.Widget;
+import org.onap.aai.babel.xml.generator.xsd.ModelElement;
+import org.onap.aai.babel.xml.generator.xsd.ModelElements;
+import org.onap.aai.babel.xml.generator.xsd.ModelVer;
+import org.onap.aai.babel.xml.generator.xsd.ModelVers;
+import org.onap.aai.babel.xml.generator.xsd.Relationship;
+import org.onap.aai.babel.xml.generator.xsd.RelationshipData;
+import org.onap.aai.babel.xml.generator.xsd.RelationshipList;
+import org.onap.aai.cl.api.Logger;
+import org.w3c.dom.DOMException;
+
+/**
+ * Generates the A&AI XML models from the Service/Resource/Widget Java models.
+ */
+public class AaiModelGenerator {
+
+ private static Logger log = LogHelper.INSTANCE;
+
+ /**
+ * Method to generate the AAI model for a Service or Resource.
+ *
+ * @param model
+ * Java object model representing an AAI {@link Service} or {@link Resource} model
+ * @return XML representation of the model in String format
+ * @throws XmlArtifactGenerationException
+ */
+ public String generateModelFor(Model model) throws XmlArtifactGenerationException {
+ org.onap.aai.babel.xml.generator.xsd.Model aaiModel = createJaxbModel(model);
+ ModelElement baseWidget = addBaseWidgetRelation(model, aaiModel);
+ generateWidgetChildren(baseWidget, model.getWidgets());
+ return getModelAsString(aaiModel);
+ }
+
+ /**
+ * Create a JAXB Model from the supplied Service or Resource.
+ *
+ * @param model
+ * the Service or Resource containing the model details
+ * @return a new Model object based on the A&AI schema
+ */
+ private org.onap.aai.babel.xml.generator.xsd.Model createJaxbModel(Model model) {
+ log.debug(model.toString());
+
+ org.onap.aai.babel.xml.generator.xsd.Model aaiModel = new org.onap.aai.babel.xml.generator.xsd.Model();
+ aaiModel.setModelInvariantId(model.getModelId());
+ aaiModel.setModelType(model.getModelTypeName());
+
+ aaiModel.setModelVers(new ModelVers());
+ aaiModel.getModelVers().getModelVer().add(createModelVersion(model));
+
+ return aaiModel;
+ }
+
+ /**
+ * Create a new JAXB object representing the model-ver complex type, and populate this with the Model Version
+ * information.
+ *
+ * @param model
+ * the Service or Resource containing the version details
+ * @return a new ModelVer object
+ */
+ private ModelVer createModelVersion(Model model) {
+ ModelVer modelVer = new ModelVer();
+ modelVer.setModelDescription(model.getModelDescription());
+ modelVer.setModelName(model.getModelName());
+ modelVer.setModelVersion(model.getModelVersion());
+ modelVer.setModelVersionId(model.getModelNameVersionId());
+ modelVer.setModelElements(new ModelElements());
+ return modelVer;
+ }
+
+ /**
+ * Add base widget model element for the Service or Resource.
+ *
+ * @param model
+ * the Service or Resource containing the Model and child resources
+ * @param aaiModel
+ * the JAXB Model to populate
+ * @return a new ModelElement for the relationship to the base Widget
+ * @throws XmlArtifactGenerationException
+ */
+ private ModelElement addBaseWidgetRelation(Model model, org.onap.aai.babel.xml.generator.xsd.Model aaiModel)
+ throws XmlArtifactGenerationException {
+ ModelElement widgetElement = createWidgetRelationshipModelElement(model);
+ ModelVer modelVer = aaiModel.getModelVers().getModelVer().get(0);
+ modelVer.getModelElements().getModelElement().add(widgetElement);
+
+ // Add the child resources to the base widget model element list
+ List<ModelElement> modelElements = widgetElement.getModelElements().getModelElement();
+ for (Resource resource : model.getResources()) {
+ modelElements.add(createRelationshipModelElement(resource));
+ }
+
+ return widgetElement;
+ }
+
+ /**
+ * Create a model-element complex type storing the relationship to a Service or Resource model's base Widget.
+ *
+ * @param model
+ * the Service or Resource model storing the widget's relationship data
+ * @return a new Java object for the model-element type storing the Widget relationship
+ * @throws XmlArtifactGenerationException
+ */
+ private ModelElement createWidgetRelationshipModelElement(Model model) throws XmlArtifactGenerationException {
+ return createRelationshipModelElement(model.getDeleteFlag(), model.getWidgetId(),
+ model.getWidgetInvariantId());
+ }
+
+ /**
+ * Create a model-element complex type storing the relationship to a Resource model.
+ *
+ * @param resource
+ * the Resource model storing the relationship data
+ * @return a new Java object for the model-element type storing the relationship
+ * @throws XmlArtifactGenerationException
+ */
+ private ModelElement createRelationshipModelElement(Resource resource) {
+ return createRelationshipModelElement(resource.getDeleteFlag(), resource.getModelNameVersionId(),
+ resource.getModelId());
+ }
+
+ /**
+ * Create a model-element complex type storing the relationship to a Widget model.
+ *
+ * @param widget
+ * the Widget model storing the relationship data
+ * @return a new Java object for the model-element type storing the Widget relationship
+ */
+ private ModelElement createRelationshipModelElement(Widget widget) {
+ return createRelationshipModelElement(widget.getDeleteFlag(), widget.getId(), widget.getWidgetId());
+ }
+
+ /**
+ * Method to create the <model-element></model-element> holding the relationship value for a resource/widget model.
+ *
+ * @param newDataDelFlag
+ * new-data-del-flag (mapped from boolean to the string T or F)
+ * @param modelVersionId
+ * model-version-id
+ * @param modelInvariantId
+ * model-invariant-id
+ * @return a new Java object for the model-element type storing the relationship
+ */
+ private ModelElement createRelationshipModelElement(boolean newDataDelFlag, String modelVersionId,
+ String modelInvariantId) {
+ ModelElement relationshipModelElement = new ModelElement();
+ relationshipModelElement.setNewDataDelFlag(newDataDelFlag ? "T" : "F");
+ relationshipModelElement.setCardinality("unbounded");
+ relationshipModelElement.setModelElements(new ModelElements());
+ relationshipModelElement.setRelationshipList(createModelRelationship(modelVersionId, modelInvariantId));
+ return relationshipModelElement;
+ }
+
+ /**
+ * Create the Model Version relationship data.
+ *
+ * @param modelVersionId
+ * model-version-id
+ * @param modelInvariantId
+ * model-invariant-id
+ * @return a new RelationshipList object containing the model-ver relationships
+ */
+ private RelationshipList createModelRelationship(String modelVersionId, String modelInvariantId) {
+ Relationship relationship = new Relationship();
+ relationship.setRelatedTo("model-ver");
+ List<RelationshipData> relationshipDataList = relationship.getRelationshipData();
+ relationshipDataList.add(createRelationshipData("model-ver.model-version-id", modelVersionId));
+ relationshipDataList.add(createRelationshipData("model.model-invariant-id", modelInvariantId));
+
+ RelationshipList relationShipList = new RelationshipList();
+ relationShipList.getRelationship().add(relationship);
+ return relationShipList;
+ }
+
+ /**
+ * Create a new RelationshipData element for the given key/value pair.
+ *
+ * @param key
+ * relationship key
+ * @param value
+ * relationship value
+ * @return a new Java object representing the relationship-data complex type
+ */
+ private RelationshipData createRelationshipData(String key, String value) {
+ RelationshipData data = new RelationshipData();
+ data.setRelationshipKey(key);
+ data.setRelationshipValue(value);
+ return data;
+ }
-public interface AaiModelGenerator {
+ /**
+ * Method to create the child model elements of the widget. Handles the generation of recursive child widget
+ * elements (if any).
+ *
+ * @param parent
+ * Reference to the parent widget model element
+ * @param widgets
+ * Set of child widgets obtained from the tosca/widget definition
+ */
+ private void generateWidgetChildren(ModelElement parent, Collection<Widget> widgets) {
+ for (Widget widget : widgets) {
+ ModelElement childRelation = createRelationshipModelElement(widget);
+ parent.getModelElements().getModelElement().add(childRelation);
+ // Recursive call to create any child widgets.
+ generateWidgetChildren(childRelation, widget.getWidgets());
+ }
+ }
- public String generateModelFor(Service service);
+ /**
+ * JAXB marshalling helper method to convert the Java object model to XML String.
+ *
+ * @param model
+ * Java Object model of a service/widget/resource
+ * @return XML representation of the Java model in String format
+ */
+ private String getModelAsString(org.onap.aai.babel.xml.generator.xsd.Model model) {
+ JAXBContext jaxbContext;
+ StringWriter modelStringWriter = new StringWriter();
+ try {
+ jaxbContext = JAXBContext.newInstance(org.onap.aai.babel.xml.generator.xsd.Model.class);
+ Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
+ jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+ jaxbMarshaller.setProperty(Marshaller.JAXB_ENCODING, "US-ASCII");
+ jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
+ jaxbMarshaller.marshal(model, modelStringWriter);
+ } catch (JAXBException jaxbException) {
+ log.error(ApplicationMsgs.INVALID_CSAR_FILE, jaxbException);
+ throw new DOMException(DOMException.SYNTAX_ERR, jaxbException.getMessage());
+ }
- public String generateModelFor(Resource resource);
+ return modelStringWriter.toString();
+ }
}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.aai.babel.xml.generator.api;
-
-import java.io.StringWriter;
-import java.util.List;
-import java.util.Set;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import org.onap.aai.babel.logging.ApplicationMsgs;
-import org.onap.aai.babel.logging.LogHelper;
-import org.onap.aai.babel.xml.generator.model.Resource;
-import org.onap.aai.babel.xml.generator.model.Service;
-import org.onap.aai.babel.xml.generator.model.Widget;
-import org.onap.aai.babel.xml.generator.xsd.Model;
-import org.onap.aai.babel.xml.generator.xsd.ModelElement;
-import org.onap.aai.babel.xml.generator.xsd.ModelElements;
-import org.onap.aai.babel.xml.generator.xsd.ModelVer;
-import org.onap.aai.babel.xml.generator.xsd.ModelVers;
-import org.onap.aai.babel.xml.generator.xsd.Relationship;
-import org.onap.aai.babel.xml.generator.xsd.RelationshipData;
-import org.onap.aai.babel.xml.generator.xsd.RelationshipList;
-import org.onap.aai.cl.api.Logger;
-import org.w3c.dom.DOMException;
-
-/**
- * Implementation of the {@link AaiModelGenerator} which generates the XML models from the Service/Resource/Widget java
- * models.
- */
-public class AaiModelGeneratorImpl implements AaiModelGenerator {
- private static Logger log = LogHelper.INSTANCE;
-
- /**
- * Method to generate the AAI model for a Service.
- *
- * @param service
- * Java object model representing an AAI {@link Service} model
- * @return XML representation of the service model in String format
- */
- @Override
- public String generateModelFor(Service service) {
- // Create a JAXB Model for AAI service model
- Model aaiServiceModel = new Model();
- log.debug("Generating Model for Service with ModelName: " + service.getModelName());
- // after new model
- aaiServiceModel.setModelInvariantId(service.getModelId());
- aaiServiceModel.setModelVers(new ModelVers());
- ModelVer modelVer = new ModelVer();
- modelVer.setModelDescription(service.getModelDescription());
- modelVer.setModelName(service.getModelName());
- modelVer.setModelVersion(service.getModelVersion());
- modelVer.setModelVersionId(service.getModelNameVersionId());
- modelVer.setModelElements(new ModelElements());
- ModelElements modelElements = modelVer.getModelElements();
- // Populate basic model details
- aaiServiceModel.setModelType(service.getModelType().name().toLowerCase()); // Using enum name as model type
- List<ModelElement> modelElementList = modelElements.getModelElement();
-
- // Add service base widget model element
- ModelElement serviceWidgetModelRelationshipElement = createRelationshipModelElement(
- getNewDataDelFlagValue(service.getDeleteFlag()), service.getWidgetId(), service.getWidgetInvariantId());
- modelElementList.add(serviceWidgetModelRelationshipElement);
-
- // Add the resource model elements
- ModelElements serviceModelElements = serviceWidgetModelRelationshipElement.getModelElements();
- List<ModelElement> serviceModelElementList = serviceModelElements.getModelElement();
- Set<Resource> serviceResources = service.getResources();
- if (serviceResources != null && !serviceResources.isEmpty()) {
- for (Resource resourceModel : serviceResources) {
- ModelElement aaiResourceModelElement =
- createRelationshipModelElement(getNewDataDelFlagValue(resourceModel.getDeleteFlag()),
- resourceModel.getModelNameVersionId(), resourceModel.getModelId());
- serviceModelElementList.add(aaiResourceModelElement);
- }
- }
-
- // Add the widget model elements
- Set<Widget> serviceWidgets = service.getWidgets();
- if (serviceWidgets != null && !serviceWidgets.isEmpty()) {
- for (Widget widgetModel : serviceWidgets) {
- ModelElement widgetModelElement =
- createRelationshipModelElement(getNewDataDelFlagValue(widgetModel.getDeleteFlag()),
- widgetModel.getId(), widgetModel.getWidgetId());
- serviceModelElementList.add(widgetModelElement);
- }
- }
- ModelVers modelVers = aaiServiceModel.getModelVers();
- List<ModelVer> modelVerList = modelVers.getModelVer();
- modelVerList.add(modelVer);
- return getModelAsString(aaiServiceModel);
- }
-
- /**
- * Method to generate the AAI model for a Resource.
- *
- * @param resource
- * Java object model representing an AAI {@link Resource} model
- * @return XML representation of the resource model in String format
- */
- @Override
- public String generateModelFor(Resource resource) {
- // Create a JAXB Model for AAI Resource model
- Model aaiResourceModel = new Model();
- log.debug("Generating Model for Resource with ModelName: " + resource.getModelName());
- aaiResourceModel.setModelInvariantId(resource.getModelId());
- aaiResourceModel.setModelVers(new ModelVers());
- ModelVer modelVer = new ModelVer();
- modelVer.setModelDescription(resource.getModelDescription());
- modelVer.setModelName(resource.getModelName());
- modelVer.setModelVersion(resource.getModelVersion());
- modelVer.setModelVersionId(resource.getModelNameVersionId());
- modelVer.setModelElements(new ModelElements());
- ModelElements modelElements = modelVer.getModelElements();
- aaiResourceModel.setModelType(resource.getModelType().name().toLowerCase()); // Using enum name as model type
- List<ModelElement> modelElementList = modelElements.getModelElement();
-
- // Add resource base widget model element
- ModelElement resourceWidgetModelRelationshipElement =
- createRelationshipModelElement(getNewDataDelFlagValue(resource.getDeleteFlag()), resource.getWidgetId(),
- resource.getWidgetInvariantId());
- modelElementList.add(resourceWidgetModelRelationshipElement);
-
- // Add the child resources to the base widget model element list
- ModelElements baseResourceWidgetModelElements = resourceWidgetModelRelationshipElement.getModelElements();
- List<ModelElement> baseResourceWidgetModelElementList = baseResourceWidgetModelElements.getModelElement();
- Set<Resource> childResources = resource.getResources();
- if (childResources != null && !childResources.isEmpty()) {
- for (Resource childResourceModel : childResources) {
- ModelElement aaiChildResourceModelElement =
- createRelationshipModelElement(getNewDataDelFlagValue(childResourceModel.getDeleteFlag()),
- childResourceModel.getModelNameVersionId(), childResourceModel.getModelId());
- baseResourceWidgetModelElementList.add(aaiChildResourceModelElement);
- }
- }
- // Add resource widgets/resources to the resource widget model relationship element
- Set<Widget> resourceWidgets = resource.getWidgets();
- if (resourceWidgets != null && !resourceWidgets.isEmpty()) {
- generateWidgetChildren(resourceWidgetModelRelationshipElement, resourceWidgets);
- }
-
- ModelVers modelVers = aaiResourceModel.getModelVers();
- List<ModelVer> modelVerList = modelVers.getModelVer();
- modelVerList.add(modelVer);
- return getModelAsString(aaiResourceModel);
- }
-
- /**
- * Method to create the <model-element></model-element> holding the relationship value for a resource/widget model.
- *
- * @param newDataDelFlag
- * Value of the <new-data-del-flag></new-data-del-flag> attribute for a widget/resource in the model xml
- * @param relationshipValue
- * Value of the <relationship-value></relationship-value> attribute for the widget/resource in the model
- * xml
- * @return Java object representation for the <model-element></model-element> holding the relationship
- */
- private ModelElement createRelationshipModelElement(String newDataDelFlag, String modelVersionId,
- String modelInvariantId) {
- ModelElement relationshipModelElement = new ModelElement();
- relationshipModelElement.setNewDataDelFlag(newDataDelFlag); // Set new-data-del-flag value
- relationshipModelElement.setCardinality("unbounded");
- RelationshipList relationShipList = new RelationshipList();
- final List<Relationship> relationships = relationShipList.getRelationship();
- Relationship relationship = new Relationship();
- relationship.setRelatedTo("model-ver");
- List<RelationshipData> relationshipDataList = relationship.getRelationshipData();
-
- RelationshipData modelVersionRelationshipData = new RelationshipData();
- modelVersionRelationshipData.setRelationshipKey("model-ver.model-version-id");
- modelVersionRelationshipData.setRelationshipValue(modelVersionId); // Set the widget/resource name-version-uuid
- // as value
- relationshipDataList.add(modelVersionRelationshipData);
- RelationshipData modelInvariantRelationshipData = new RelationshipData();
- modelInvariantRelationshipData.setRelationshipKey("model.model-invariant-id");
- modelInvariantRelationshipData.setRelationshipValue(modelInvariantId);
- relationshipDataList.add(modelInvariantRelationshipData);
- relationships.add(relationship);
- relationshipModelElement.setRelationshipList(relationShipList);
- relationshipModelElement.setModelElements(new ModelElements());
- return relationshipModelElement;
- }
-
- /**
- * Method to create the child model elements of the widget. Handles the generation of recursive child widget
- * elements (if any)
- *
- * @param parent
- * Reference to the parent widget model element
- * @param widgetChildrenSet
- * Set of children obtained from the tosca/widget definition
- */
- private void generateWidgetChildren(ModelElement parent, Set<Widget> widgetChildrenSet) {
- for (Widget widget : widgetChildrenSet) {
- Set<Widget> widgetSubChildren = widget.getWidgets();
- if (widgetSubChildren != null && !widgetSubChildren.isEmpty()) {
- ModelElement widgetChildRelationshipElement = createRelationshipModelElement(
- getNewDataDelFlagValue(widget.getDeleteFlag()), widget.getId(), widget.getWidgetId());
- // Recursive call for getting the children of widgets (if any)
- generateWidgetChildren(widgetChildRelationshipElement, widgetSubChildren);
- parent.getModelElements().getModelElement().add(widgetChildRelationshipElement);
- } else {
- ModelElement widgetChildRelationshipElement = createRelationshipModelElement(
- getNewDataDelFlagValue(widget.getDeleteFlag()), widget.getId(), widget.getWidgetId());
- parent.getModelElements().getModelElement().add(widgetChildRelationshipElement);
- }
- }
- }
-
- /**
- * Converts the data delete flag value from boolean to String as per AAI model.
- *
- * @param delFlag
- * Boolean value as true/false from the annotation
- * @return Converted value to a flag as per AAI model
- */
- private String getNewDataDelFlagValue(boolean delFlag) {
- return delFlag ? "T" : "F";
- }
-
- /**
- * JAXB marshalling helper method to convert the Java object model to XML String.
- *
- * @param model
- * Java Object model of a service/widget/resource
- * @return XML representation of the Java model in String format
- */
- private String getModelAsString(Model model) {
- JAXBContext jaxbContext;
- StringWriter modelStringWriter = new StringWriter();
- try {
- jaxbContext = JAXBContext.newInstance(Model.class);
- Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
- jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
- jaxbMarshaller.setProperty(Marshaller.JAXB_ENCODING, "US-ASCII");
- jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
- jaxbMarshaller.marshal(model, modelStringWriter);
- } catch (JAXBException jaxbException) {
- log.error(ApplicationMsgs.INVALID_CSAR_FILE, jaxbException);
- throw new DOMException(DOMException.SYNTAX_ERR, jaxbException.getMessage());
- }
-
- return modelStringWriter.toString();
- }
-}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.babel.xml.generator.data;
public class Artifact {
return payload;
}
- public String getChecksum() {
- return checksum;
- }
-
- public String getType() {
- return type;
- }
-
- public String getGroupType() {
- return groupType;
- }
-
public String getName() {
return name;
}
this.name = name;
}
- public String getLabel() {
- return label;
- }
-
public void setLabel(String label) {
this.label = label;
}
- public String getDescription() {
- return description;
- }
-
public void setDescription(String description) {
this.description = description;
}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.babel.xml.generator.data;
import java.util.ArrayList;
List<Artifact> resultData = new ArrayList<>();
Map<String, List<String>> errorData = new HashMap<>();
- public void add(List<Artifact> resultData, Map<String, List<String>> errorData) {
- this.resultData.addAll(resultData);
- this.errorData.putAll(errorData);
- }
-
public void add(Artifact generatedArtifact) {
resultData.add(generatedArtifact);
}
/**
- * Add the error code to the list of error codes for the given ID
+ * Add the error code to the list of error codes for the given ID.
*
* @param generatorId the generator id
* @param errorCode the error code
errorData.get(generatorId).add(errorCode);
}
- public void add(GenerationData generationData) {
- this.resultData.addAll(generationData.resultData);
- this.errorData.putAll(generationData.errorData);
- }
-
public List<Artifact> getResultData() {
return resultData;
}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.babel.xml.generator.data;
import java.util.Base64;
public final class GeneratorUtil {
/*
- * Private constructor to prevent instantiation
+ * Private constructor to prevent instantiation.
*/
private GeneratorUtil() {}
- /**
- * Decodes Base64 encode byte array input.
- *
- * @param input Base64 encoded byte array
- * @return Decoded byte array
- */
- public static byte[] decode(byte[] input) {
- return input != null ? Base64.getDecoder().decode(input) : new byte[0];
- }
-
/**
* Encode a byte array input using Base64 encoding.
*
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
private List<String> instanceGroupTypes;
+ /**
+ * Set of Widget Types.
+ */
+ private List<WidgetTypeConfig> widgetTypes;
+
/**
* Mapping from TOSCA type to Widget directly.
*/
return instanceGroupTypes;
}
+ public List<WidgetTypeConfig> getWidgetTypes() {
+ return widgetTypes;
+ }
+
public List<WidgetMapping> getWidgetMappings() {
return widgetMappings;
}
+
}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
package org.onap.aai.babel.xml.generator.data;
+import com.google.common.base.Enums;
+import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Properties;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
import org.onap.aai.babel.xml.generator.model.Resource;
+import org.onap.aai.babel.xml.generator.model.WidgetType;
import org.onap.aai.babel.xml.generator.model.Widget;
+import org.onap.aai.babel.xml.generator.types.ModelType;
public class WidgetConfigurationUtil {
private static Properties config;
private static List<String> instanceGroups = Collections.emptyList();
- private static Map<String, Resource> typeToWidget = new HashMap<>();
+ private static Map<String, Resource> typeToResource = new HashMap<>();
+ private static Map<String, Widget> typeToWidget = new HashMap<>();
/*
- * Private constructor to prevent instantiation
+ * Private constructor to prevent instantiation.
*/
private WidgetConfigurationUtil() {
throw new UnsupportedOperationException("This static class should not be instantiated!");
}
public static Optional<Resource> createModelFromType(String typePrefix) {
- return Optional.ofNullable(typeToWidget.get(typePrefix));
+ return Optional.ofNullable(typeToResource.get(typePrefix));
}
- public static void setWidgetMappings(List<WidgetMapping> mappings) {
+ public static Widget createWidgetFromType(String widgetType) throws XmlArtifactGenerationException {
+ Optional<Widget> widget = Optional.ofNullable(typeToWidget.get(widgetType));
+ if (widget.isPresent()) {
+ // Make a copy of the Widget found in the mappings table.
+ return new Widget(widget.get());
+ }
+ return null;
+ }
+
+ public static void setWidgetTypes(List<WidgetTypeConfig> types) {
+ for (WidgetTypeConfig type : types) {
+ if (type.type == null || type.name == null) {
+ throw new IllegalArgumentException("Incomplete widget type specified: " + type);
+ }
+ WidgetType widgetType = new WidgetType(type.type);
+ Widget widget = new Widget(widgetType, type.name, type.deleteFlag);
+ typeToWidget.put(type.type, widget);
+ }
+ WidgetType.validateElements();
+ }
+
+ public static void setWidgetMappings(List<WidgetMapping> mappings) throws IOException {
for (WidgetMapping mapping : mappings) {
- if (mapping.prefix == null || mapping.widget == null) {
- throw new IllegalArgumentException("Incomplete widget mapping specified: " + mapping);
+ ModelType modelType = Optional.ofNullable(mapping.type).map(String::toUpperCase)
+ .map(s -> Enums.getIfPresent(ModelType.class, s).orNull()).orElse(null);
+ if (mapping.prefix == null || mapping.widget == null || modelType == null) {
+ throw new IOException("Invalid widget mapping specified: " + mapping);
}
- Resource resource = new Resource(Widget.Type.valueOf(mapping.widget), mapping.deleteFlag);
- resource.setIsResource(mapping.type.equalsIgnoreCase("resource"));
- typeToWidget.put(mapping.prefix, resource);
+ Resource resource = new Resource(WidgetType.valueOf(mapping.widget), mapping.deleteFlag);
+ resource.setModelType(modelType);
+ typeToResource.put(mapping.prefix, resource);
}
}
}
package org.onap.aai.babel.xml.generator.data;
-import java.util.Map;
-
public class WidgetMapping {
- String prefix = null;
+ String prefix;
String type = "resource"; // Default type is Resource (not Widget)
- String widget = null;
+ String widget;
boolean deleteFlag = true;
- Map<String, Object> properties;
public void setType(String type) {
this.type = type;
@Override
public String toString() {
return "WidgetMapping [prefix=" + prefix + ", type=" + type + ", widget=" + widget + ", deleteFlag="
- + deleteFlag + ", properties=" + properties + "]";
+ + deleteFlag + "]";
}
}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-package org.onap.aai.babel.xml.generator.model;
-public class ResourceWidget extends Widget {
+package org.onap.aai.babel.xml.generator.data;
+
+/**
+ * Widget Type as configured in the TOSCA Mappings.
+ *
+ */
+public class WidgetTypeConfig {
+
+ String type;
+ String name;
+ boolean deleteFlag = false;
+
}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.ALLOTTED_RESOURCE,
- cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "allotted-resource")
-public class AllotedResourceWidget extends ResourceWidget {
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.CR, cardinality = Cardinality.UNBOUNDED,
- dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "cr")
-public class CRWidget extends ResourceWidget {
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.CONFIGURATION, cardinality = Cardinality.UNBOUNDED,
- dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "configuration")
-public class ConfigurationWidget extends ResourceWidget {
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@Model(widget = Widget.Type.FLAVOR, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = false)
-@ModelWidget(type = ModelType.WIDGET, name = "flavor")
-public class FlavorWidget extends ResourceWidget {
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@Model(widget = Widget.Type.IMAGE, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = false)
-@ModelWidget(type = ModelType.WIDGET, name = "image")
-public class ImageWidget extends ResourceWidget {
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.INSTANCE_GROUP, cardinality = Cardinality.UNBOUNDED,
- dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "instance-group")
-public class InstanceGroupWidget extends Widget {
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.L3_NET, cardinality = Cardinality.UNBOUNDED,
- dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "l3-network")
-public class L3NetworkWidget extends Widget {
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@Model(widget = Widget.Type.LINT, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "l-interface")
-public class LIntfWidget extends ResourceWidget {
-}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.babel.xml.generator.model;
import java.util.Collections;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil;
-import org.onap.aai.babel.xml.generator.error.IllegalAccessException;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
-import org.onap.aai.babel.xml.generator.types.ModelType;
public abstract class Model {
public abstract void populate(Model model, String value);
}
- private String modelId;
+ private String modelId; // model-invariant-id
private String modelName;
- private String modelNameVersionId;
+ private String modelNameVersionId; // model-version-id
private String modelVersion;
private String modelDescription;
protected Set<Widget> widgets = new HashSet<>();
/**
- * Gets the object (model) corresponding to the supplied TOSCA type.
+ * Gets the Resource Model corresponding to the supplied TOSCA type.
*
* @param toscaType
- * the tosca type
+ * the tosca type
* @return the model for the type, or null
*/
public static Resource getModelFor(String toscaType) {
* information.
*
* @param toscaType
- * the TOSCA type
+ * the TOSCA type
* @param metaDataType
- * the type from the TOSCA metadata
+ * the type from the TOSCA metadata
* @return the model for the type, or null
*/
public static Resource getModelFor(String toscaType, String metaDataType) {
if ("Configuration".equals(metaDataType)) {
- return new Resource(Type.CONFIGURATION, true);
+ return new Resource(WidgetType.valueOf("CONFIGURATION"), true);
} else if ("CR".equals(metaDataType)) {
- return new Resource(Type.CR, true);
+ return new Resource(WidgetType.valueOf("CR"), true);
} else {
return getModelFor(toscaType);
}
}
- public abstract boolean addResource(Resource resource);
-
- public abstract boolean addWidget(Widget resource);
+ public abstract boolean addWidget(Widget resource) throws XmlArtifactGenerationException;
- public abstract Widget.Type getWidgetType();
+ public abstract WidgetType getWidgetType();
- public abstract Map<String, Object> getProperties();
+ public abstract String getModelTypeName();
- public abstract boolean isResource();
+ public boolean addResource(Resource resource) {
+ return resources.add(resource);
+ }
/**
* Gets delete flag.
* @return the delete flag
*/
public boolean getDeleteFlag() {
- org.onap.aai.babel.xml.generator.types.Model model =
- this.getClass().getAnnotation(org.onap.aai.babel.xml.generator.types.Model.class);
- return model.dataDeleteFlag();
+ return true;
}
public String getModelDescription() {
}
public String getModelId() {
- checkSupported();
return modelId;
}
}
public String getModelNameVersionId() {
- checkSupported();
return modelNameVersionId;
}
- /**
- * Gets model type.
- *
- * @return the model type
- */
- public ModelType getModelType() {
- if (this instanceof Service) {
- return ModelType.SERVICE;
- } else if (this instanceof Resource) {
- return ModelType.RESOURCE;
- } else if (this instanceof Widget) {
- return ModelType.WIDGET;
- } else {
- return null;
- }
- }
-
/**
* Gets widget version id.
*
* @return the widget version id
+ * @throws XmlArtifactGenerationException
*/
- public String getWidgetId() {
- org.onap.aai.babel.xml.generator.types.Model model =
- this.getClass().getAnnotation(org.onap.aai.babel.xml.generator.types.Model.class);
- return Widget.getWidget(model.widget()).getId();
+ public String getWidgetId() throws XmlArtifactGenerationException {
+ return Widget.getWidget(getWidgetType()).getId();
}
/**
* Gets invariant id.
*
* @return the invariant id
+ * @throws XmlArtifactGenerationException
*/
- public String getWidgetInvariantId() {
- org.onap.aai.babel.xml.generator.types.Model model =
- this.getClass().getAnnotation(org.onap.aai.babel.xml.generator.types.Model.class);
- return Widget.getWidget(model.widget()).getWidgetId();
+ public String getWidgetInvariantId() throws XmlArtifactGenerationException {
+ return Widget.getWidget(getWidgetType()).getWidgetId();
}
/**
* Populate model identification information.
*
* @param modelIdentInfo
- * the model ident info
+ * the model ident info
*/
public void populateModelIdentificationInformation(Map<String, String> modelIdentInfo) {
Iterator<String> iter = modelIdentInfo.keySet().iterator();
return widgets;
}
- private void checkSupported() {
- if (this instanceof Widget) {
- throw new IllegalAccessException(GENERATOR_AAI_ERROR_UNSUPPORTED_WIDGET_OPERATION);
- }
+ @Override
+ public String toString() {
+ return "Model [type=" + getModelTypeName() + ", name=" + getModelName() + "]";
}
}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@Model(widget = Widget.Type.L3_NET, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "oam-network")
-public class OamNetwork extends Widget {
-}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
+import org.onap.aai.babel.xml.generator.types.ModelType;
public class Resource extends Model {
- private Type type;
+ private WidgetType type;
private boolean deleteFlag;
- private boolean isResource = true;
+ private ModelType modelType = ModelType.RESOURCE;
private Map<String, Object> properties = Collections.emptyMap();
Widget vserver = null;
boolean addvolume = false;
List<String> members;
- public Resource(Type type, boolean deleteFlag) {
+ public Resource(WidgetType type, boolean deleteFlag) {
this.type = type;
this.deleteFlag = deleteFlag;
}
return false;
}
+ @Override
public boolean getDeleteFlag() {
return deleteFlag;
}
- public String getWidgetInvariantId() {
- return Widget.getWidget(getWidgetType()).getWidgetId();
- }
-
- public String getWidgetId() {
- return Widget.getWidget(getWidgetType()).getId();
- }
-
public void setProperties(Map<String, Object> properties) {
this.properties = properties;
}
- @Override
public Map<String, Object> getProperties() {
return properties;
}
- public void setIsResource(boolean isResource) {
- this.isResource = isResource;
+ public void setModelType(ModelType type) {
+ this.modelType = type;
}
- @Override
- public boolean isResource() {
- return isResource;
+ public ModelType getModelType() {
+ return modelType;
}
public void setMembers(List<String> members) {
this.members = members;
}
- @Override
- public boolean addResource(Resource resource) {
- return resources.add(resource);
- }
-
/**
* Adds a Widget.
*
* @param widget
* the widget
* @return the boolean
+ * @throws XmlArtifactGenerationException
*/
@Override
- public boolean addWidget(Widget widget) {
- if (type == Type.VFMODULE) {
+ public boolean addWidget(Widget widget) throws XmlArtifactGenerationException {
+ if (type == WidgetType.valueOf("VFMODULE")) {
if (widget.memberOf(members)) {
- if (vserver == null && widget instanceof VServerWidget) {
+ if (vserver == null && widget.getWidgetType() == WidgetType.valueOf("VSERVER")) {
addVserverWidget(widget);
- } else if (widget instanceof LIntfWidget) {
+ } else if (widget.getWidgetType() == WidgetType.valueOf("LINT")) {
return addLIntfWidget(widget);
- } else if (widget instanceof VolumeWidget) {
+ } else if (widget.getWidgetType() == WidgetType.valueOf("VOLUME")) {
addVolumeWidget(widget);
return true;
}
- if (!(widget instanceof OamNetwork)) {
+ if (widget.getWidgetType() != WidgetType.valueOf("OAM_NETWORK")) {
return widgets.add(widget);
}
}
}
}
- public Type getWidgetType() {
+ public WidgetType getWidgetType() {
return type;
}
+ public String getModelTypeName() {
+ return "resource";
+ }
+
@Override
public String toString() {
- return "Widget type " + getWidgetType() + ", isResource=" + isResource() + ", deleteFlag=" + deleteFlag;
+ return "Resource [widget type=" + getWidgetType() + ", deleteFlag=" + deleteFlag + ", modelType=" + modelType
+ + ", properties=" + properties + ", vserver=" + vserver + ", addlintf=" + addlintf + ", addvolume="
+ + addvolume + ", members=" + members + "]";
}
private void addVolumeWidget(Widget widget) {
}
}
- private void addVserverWidget(Widget widget) {
+ private void addVserverWidget(Widget widget) throws XmlArtifactGenerationException {
vserver = widget;
if (addlintf) {
- vserver.addWidget(new LIntfWidget());
+ vserver.addWidget(Widget.getWidget(WidgetType.valueOf("LINT")));
}
if (addvolume) {
- vserver.addWidget(new VolumeWidget());
+ vserver.addWidget(Widget.getWidget(WidgetType.valueOf("VOLUME")));
}
}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-package org.onap.aai.babel.xml.generator.model;
-import java.util.Collections;
-import java.util.Map;
-import org.onap.aai.babel.xml.generator.types.Cardinality;
+package org.onap.aai.babel.xml.generator.model;
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.SERVICE, cardinality = Cardinality.UNBOUNDED,
- dataDeleteFlag = true)
public class Service extends Model {
- @Override
- public boolean addResource(Resource resource) {
- return resources.add(resource);
- }
-
@Override
public boolean addWidget(Widget widget) {
return widgets.add(widget);
}
@Override
- public Widget.Type getWidgetType() {
- return null;
- }
-
- @Override
- public Map<String, Object> getProperties() {
- return Collections.emptyMap();
+ public WidgetType getWidgetType() {
+ return WidgetType.valueOf("SERVICE");
}
- @Override
- public boolean isResource() {
- return false;
+ public String getModelTypeName() {
+ return "service";
}
}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@ModelWidget(type = ModelType.WIDGET, name = "service-instance")
-public class ServiceWidget extends Widget {
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@Model(widget = Widget.Type.TENANT, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = false)
-@ModelWidget(type = ModelType.WIDGET, name = "tenant")
-public class TenantWidget extends Widget {
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.TUNNEL_XCONNECT, cardinality = Cardinality.UNBOUNDED,
- dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "tunnel-xconnect")
-public class TunnelXconnectWidget extends Widget {
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@Model(widget = Widget.Type.VSERVER, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "vserver")
-public class VServerWidget extends Widget {
-
- /** Instantiates a new vserver widget. */
- public VServerWidget() {
- addWidget(new FlavorWidget());
- addWidget(new ImageWidget());
- addWidget(new TenantWidget());
- addWidget(new VfcWidget());
- }
-
- @Override
- public boolean addWidget(Widget widget) {
- return widgets.add(widget);
- }
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.VFMODULE, cardinality = Cardinality.UNBOUNDED,
- dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "vf-module")
-public class VfModuleWidget extends Widget {
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.VF, cardinality = Cardinality.UNBOUNDED,
- dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "generic-vnf")
-public class VfWidget extends ResourceWidget {
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.VFC, cardinality = Cardinality.UNBOUNDED,
- dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "vnfc")
-public class VfcWidget extends ResourceWidget {
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.VOLUME_GROUP, cardinality = Cardinality.UNBOUNDED,
- dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "volume-group")
-public class VolumeGroupWidget extends Widget {
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@Model(widget = Widget.Type.VOLUME, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "volume")
-public class VolumeWidget extends ResourceWidget {
-}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.babel.xml.generator.model;
-import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.Collections;
-import java.util.EnumMap;
import java.util.HashSet;
-import java.util.Map;
import java.util.Properties;
import java.util.Set;
-import org.onap.aai.babel.logging.ApplicationMsgs;
-import org.onap.aai.babel.logging.LogHelper;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
import org.onap.aai.babel.xml.generator.data.ArtifactType;
import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil;
import org.onap.aai.babel.xml.generator.error.IllegalAccessException;
import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-import org.onap.aai.cl.api.Logger;
-public abstract class Widget extends Model {
+public class Widget extends Model {
public static final String GENERATOR_AAI_CONFIGLPROP_NOT_FOUND =
"Cannot generate artifacts. Widget configuration not found for %s";
- public enum Type {
- SERVICE, VF, VFC, VSERVER, VOLUME, FLAVOR, TENANT, VOLUME_GROUP, LINT, L3_NET, VFMODULE, IMAGE, OAM_NETWORK, ALLOTTED_RESOURCE, TUNNEL_XCONNECT, CONFIGURATION, CR, INSTANCE_GROUP;
- }
+ private Set<String> keys = new HashSet<>();
- private static Logger log = LogHelper.INSTANCE;
+ protected String name;
+ protected WidgetType type;
+ protected boolean deleteFlag = false;
- private Set<String> keys = new HashSet<>();
+ public Widget(WidgetType widgetType, String name, boolean deleteFlag) {
+ type = widgetType;
+ this.name = name;
+ this.deleteFlag = deleteFlag;
+ }
- private static EnumMap<Widget.Type, Class<? extends Widget>> typeToWidget = new EnumMap<>(Widget.Type.class);
- static {
- typeToWidget.put(Type.SERVICE, ServiceWidget.class);
- typeToWidget.put(Type.VF, VfWidget.class);
- typeToWidget.put(Type.VFC, VfcWidget.class);
- typeToWidget.put(Type.VSERVER, VServerWidget.class);
- typeToWidget.put(Type.VOLUME, VolumeWidget.class);
- typeToWidget.put(Type.FLAVOR, FlavorWidget.class);
- typeToWidget.put(Type.TENANT, TenantWidget.class);
- typeToWidget.put(Type.VOLUME_GROUP, VolumeGroupWidget.class);
- typeToWidget.put(Type.LINT, LIntfWidget.class);
- typeToWidget.put(Type.L3_NET, L3NetworkWidget.class);
- typeToWidget.put(Type.VFMODULE, VfModuleWidget.class);
- typeToWidget.put(Type.IMAGE, ImageWidget.class);
- typeToWidget.put(Type.OAM_NETWORK, OamNetwork.class);
- typeToWidget.put(Type.ALLOTTED_RESOURCE, AllotedResourceWidget.class);
- typeToWidget.put(Type.TUNNEL_XCONNECT, TunnelXconnectWidget.class);
- typeToWidget.put(Type.CONFIGURATION, ConfigurationWidget.class);
- typeToWidget.put(Type.CR, CRWidget.class);
- typeToWidget.put(Type.INSTANCE_GROUP, InstanceGroupWidget.class);
+ /**
+ * Copy Constructor.
+ *
+ * @param baseWidget
+ * @throws XmlArtifactGenerationException
+ */
+ public Widget(Widget baseWidget) throws XmlArtifactGenerationException {
+ this(baseWidget.getWidgetType(), baseWidget.getName(), baseWidget.getDeleteFlag());
+ if (type == WidgetType.valueOf("VSERVER")) {
+ widgets.add(getWidget(WidgetType.valueOf("FLAVOR")));
+ widgets.add(getWidget(WidgetType.valueOf("IMAGE")));
+ widgets.add(getWidget(WidgetType.valueOf("TENANT")));
+ widgets.add(getWidget(WidgetType.valueOf("VFC")));
+ }
}
/**
* Gets widget.
*
- * @param type
- * the type
- * @return the widget
+ * @param typeString
+ *
+ * @return a new widget of the specified type
+ * @throws XmlArtifactGenerationException
+ * if there is no configuration defined for the specified type
*/
- public static Widget getWidget(Type type) {
- Widget widget = null;
- Class<? extends Widget> clazz = typeToWidget.get(type);
- if (clazz != null) {
- try {
- widget = clazz.getConstructor().newInstance();
- } catch (InstantiationException | java.lang.IllegalAccessException | IllegalArgumentException
- | InvocationTargetException | NoSuchMethodException | SecurityException e) {
- log.error(ApplicationMsgs.INVALID_CSAR_FILE, e);
- }
+ public static Widget getWidget(WidgetType type) throws XmlArtifactGenerationException {
+ Widget widget = WidgetConfigurationUtil.createWidgetFromType(type.toString());
+ if (widget == null) {
+ throw new XmlArtifactGenerationException("No widget type is defined for " + type);
}
return widget;
}
- @Override
- public boolean isResource() {
- return false;
- }
-
public String getId() {
String id = WidgetConfigurationUtil.getConfig()
.getProperty(ArtifactType.AAI.name() + ".model-version-id." + getName());
}
public ModelType getType() {
- ModelWidget widgetModel = this.getClass().getAnnotation(ModelWidget.class);
- return widgetModel.type();
+ return ModelType.WIDGET;
}
public String getName() {
- return this.getClass().getAnnotation(ModelWidget.class).name();
+ return name;
}
/**
}
@Override
- public Type getWidgetType() {
- return null;
+ public WidgetType getWidgetType() {
+ return type;
}
/**
@Override
public boolean addWidget(Widget widget) {
+ if (getWidgetType() == WidgetType.valueOf("VSERVER")) {
+ return widgets.add(widget);
+ }
return true;
}
@Override
- public Map<String, Object> getProperties() {
- return Collections.emptyMap();
+ public String toString() {
+ return getName() + " Widget keys=" + keys + ", resources=" + resources + ", widgets=" + widgets;
}
+
+ @Override
+ public boolean getDeleteFlag() {
+ return deleteFlag;
+ }
+
+ @Override
+ public String getModelTypeName() {
+ throw new IllegalAccessException(GENERATOR_AAI_ERROR_UNSUPPORTED_WIDGET_OPERATION);
+ }
+
+ @Override
+ public String getModelId() {
+ throw new IllegalAccessException(GENERATOR_AAI_ERROR_UNSUPPORTED_WIDGET_OPERATION);
+ }
+
+ @Override
+ public String getModelNameVersionId() {
+ throw new IllegalAccessException(GENERATOR_AAI_ERROR_UNSUPPORTED_WIDGET_OPERATION);
+ }
+
}
--- /dev/null
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aai.babel.xml.generator.model;
+
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Widget Type Enumeration.
+ *
+ */
+public class WidgetType {
+
+ /**
+ * Dynamically created set of Widget Types.
+ */
+ private static Map<String, WidgetType> elements = new LinkedHashMap<>();
+
+ /**
+ * Types that must be present for Model generation to function correctly.
+ */
+ private static final List<String> mandatoryElements = Arrays.asList( //
+ "SERVICE", "VF", "VFC", "VSERVER", "VOLUME", "FLAVOR", "TENANT", "VOLUME_GROUP", "LINT", "L3_NET",
+ "VFMODULE", "IMAGE", "OAM_NETWORK", "ALLOTTED_RESOURCE", "TUNNEL_XCONNECT", "CONFIGURATION", "CR",
+ "INSTANCE_GROUP");
+
+ private final String name;
+
+ public WidgetType(String name) {
+ this.name = name;
+ elements.put(name, this);
+ }
+
+ public static void validateElements() {
+ mandatoryElements.forEach(WidgetType::valueOf);
+ }
+
+ public static WidgetType valueOf(String typeName) {
+ WidgetType type = elements.get(typeName);
+ if (type == null) {
+ throw new IllegalArgumentException("Unknown type " + typeName);
+ }
+ return type;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+}
+
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.types;
-
-public enum Cardinality {
- UNBOUNDED
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.types;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import org.onap.aai.babel.xml.generator.model.Widget;
-
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface Model {
-
- /**
- * Widget widget . type.
- *
- * @return the widget . type
- */
- public Widget.Type widget();
-
- /**
- * Data delete flag boolean.
- *
- * @return the boolean
- */
- public boolean dataDeleteFlag();
-
- /**
- * Cardinality cardinality.
- *
- * @return the cardinality
- */
- public Cardinality cardinality();
-}
+++ /dev/null
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai.babel.xml.generator.types;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ModelWidget {
-
- /**
- * Type model type.
- *
- * @return the model type
- */
- public ModelType type();
-
- /**
- * Name string.
- *
- * @return the string
- */
- public String name();
-}
# ============LICENSE_START=======================================================
# org.onap.aai
# ================================================================================
-# Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
-# Copyright © 2017-2018 European Software Marketing Ltd.
+# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+# Copyright (c) 2017-2019 European Software Marketing Ltd.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# limitations under the License.
# ============LICENSE_END=========================================================
-#Resource key=Error Code|Message text|Resolution text |Description text
-#######
-#Newlines can be utilized to add some clarity ensuring continuing line
-#has at least one leading space
-#ResourceKey=\
+# Resource key=Error Code|Message text|Resolution text |Description text
+#
+# For example:
+# ResourceKey=\
# ERR0000E\
# Sample error msg txt\
# Sample resolution msg\
# Sample description txt
#
-######
-#Error code classification category
-#000 Info/Debug
-#100 Permission errors
-#200 Availability errors/Timeouts
-#300 Data errors
-#400 Schema Interface type/validation errors
-#500 Business process errors
-#900 Unknown errors
-#
-########################################################################
+# Error code classification category
+# 000 Info/Debug
+# 100 Permission errors
+# 200 Availability errors/Timeouts
+# 300 Data errors
+# 400 Schema Interface type/validation errors
+# 500 Business process errors
+# 900 Unknown errors
DISTRIBUTION_EVENT=\
BABEL0001I|\
TEMP_FILE_ERROR=\
BABEL0012E|\
Error creating temporary CSAR file.|\
-
\ No newline at end of file
+
+LOAD_PROPERTIES=\
+ BABEL0013E|\
+ Error loading properties: {0}|\
+ Correct the file contents|\
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
+import java.util.concurrent.TimeUnit;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
+import org.junit.Before;
import org.junit.Test;
import org.onap.aai.auth.AAIAuthException;
import org.onap.aai.auth.AAIMicroServiceAuth;
private static final String VALID_ADMIN_USER = "cn=common-name, ou=org-unit, o=org, l=location, st=state, c=us";
private static final String authPolicyFile = "auth_policy.json";
- static {
- System.setProperty("CONFIG_HOME", System.getProperty("user.dir") + File.separator + "src/test/resources");
+ @Before
+ public void setup() {
+ System.setProperty("CONFIG_HOME", "src/test/resources");
}
/**
- * Temporarily invalidate the default policy file and then try to initialise the authorisation class using the name
+ * Test authorization of a request when authentication is disabled.
+ *
+ * @throws AAIAuthException
+ * if the test creates invalid Auth Policy roles
+ */
+ @Test
+ public void testAuthenticationDisabled() throws AAIAuthException {
+ BabelAuthConfig babelAuthConfig = new BabelAuthConfig();
+ babelAuthConfig.setAuthenticationDisable(true);
+ AAIMicroServiceAuth auth = new AAIMicroServiceAuth(babelAuthConfig);
+ assertThat(auth.validateRequest(null, new MockHttpServletRequest(), null, "any/uri"), is(true));
+ }
+
+ /**
+ * Temporarily invalidate the default policy file and then try to initialize the authorization class using the name
* of a policy file that does not exist.
*
* @throws AAIAuthException
}
}
+ /**
+ * Temporarily invalidate the default policy file and then try to initialize the authorization class using a null
+ * policy file name.
+ *
+ * @throws AAIAuthException
+ * if the Auth policy file cannot be loaded
+ */
+ @Test(expected = AAIAuthException.class)
+ public void testNullPolicyFile() throws AAIAuthException {
+ String defaultFile = AAIMicroServiceAuthCore.getDefaultAuthFileName();
+ try {
+ AAIMicroServiceAuthCore.setDefaultAuthFileName("invalid.default.file");
+ BabelAuthConfig babelServiceAuthConfig = new BabelAuthConfig();
+ babelServiceAuthConfig.setAuthPolicyFile(null);
+ new AAIMicroServiceAuth(babelServiceAuthConfig);
+ } finally {
+ AAIMicroServiceAuthCore.setDefaultAuthFileName(defaultFile);
+ }
+ }
+
/**
* Test loading of a temporary file created with the specified roles.
*
assertThat(AAIMicroServiceAuthCore.authorize("user", "method:func"), is(true));
}
+ /**
+ * Test re-loading of users by changing the contents of a temporary file.
+ *
+ * @throws JSONException
+ * if this test creates an invalid JSON object
+ * @throws AAIAuthException
+ * if the test creates invalid Auth Policy roles
+ * @throws IOException
+ * for I/O failures
+ * @throws InterruptedException
+ * if interrupted while sleeping
+ */
+ @Test
+ public void createLocalAuthFileOnChange()
+ throws JSONException, AAIAuthException, IOException, InterruptedException {
+ JSONObject roles = createRoleObject("role", createUserObject("user"), createFunctionObject("func"));
+ File file = createTempPolicyFile(roles);
+
+ BabelAuthConfig babelAuthConfig = new BabelAuthConfig();
+ babelAuthConfig.setAuthPolicyFile(file.getAbsolutePath());
+ new AAIMicroServiceAuth(babelAuthConfig);
+
+ // Make changes to the temp file
+ FileWriter fileWriter = new FileWriter(file);
+ fileWriter.write("");
+ fileWriter.flush();
+ fileWriter.close();
+
+ // Wait for the file to be reloaded
+ TimeUnit.SECONDS.sleep(3);
+
+ AAIMicroServiceAuthCore.cleanup();
+ }
+
/**
* Test that the default policy file is loaded when a non-existent file is passed to the authorisation class.
*
assertAdminUserAuthorisation(auth, VALID_ADMIN_USER);
}
+ /**
+ * Test that the default policy file is loaded when a non-existent file is passed to the authorisation class and
+ * CONFIG_HOME is not set.
+ *
+ * @throws AAIAuthException
+ * if the Auth Policy cannot be loaded
+ */
+ @Test
+ public void createAuthFromDefaultFileAppHome() throws AAIAuthException {
+ System.clearProperty("CONFIG_HOME");
+ System.setProperty("APP_HOME", "src/test/resources");
+ BabelAuthConfig babelServiceAuthConfig = new BabelAuthConfig();
+ babelServiceAuthConfig.setAuthPolicyFile("non-existent-file");
+ new AAIMicroServiceAuth(babelServiceAuthConfig);
+ // The default policy will have been loaded from APP_HOME/appconfig
+ }
+
/**
* Test loading of the policy file relative to CONFIG_HOME.
*
* if the auth policy file cannot be loaded
*/
private AAIMicroServiceAuth createAuthService(JSONObject roles) throws AAIAuthException, IOException {
+ File file = createTempPolicyFile(roles);
+ BabelAuthConfig babelAuthConfig = new BabelAuthConfig();
+ babelAuthConfig.setAuthPolicyFile(file.getAbsolutePath());
+ return new AAIMicroServiceAuth(babelAuthConfig);
+ }
+
+ /**
+ * Create a temporary JSON file using the supplied roles.
+ *
+ * @param roles
+ * the roles to use to populate the new file
+ * @return the new temporary file
+ * @throws IOException
+ * for I/O errors
+ */
+ private File createTempPolicyFile(JSONObject roles) throws IOException {
File file = File.createTempFile("auth-policy", "json");
file.deleteOnExit();
FileWriter fileWriter = new FileWriter(file);
fileWriter.write(roles.toString());
fileWriter.flush();
fileWriter.close();
-
- BabelAuthConfig babelAuthConfig = new BabelAuthConfig();
- babelAuthConfig.setAuthPolicyFile(file.getAbsolutePath());
- return new AAIMicroServiceAuth(babelAuthConfig);
+ return file;
}
/**
--- /dev/null
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aai.babel;
+
+import java.io.IOException;
+import org.eclipse.jetty.util.security.Password;
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeMatcher;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest(classes = BabelApplication.class)
+public class TestApplication {
+
+ @Rule
+ public ExpectedException expectedEx = ExpectedException.none();
+
+ /**
+ * Initialize System Properties.
+ */
+ @Before
+ public void init() {
+ System.setProperty("APP_HOME", ".");
+ System.setProperty("CONFIG_HOME", "src/test/resources");
+ System.setProperty("server.ssl.key-store", "src/test/resources/auth/keystore.jks");
+ }
+
+ @Test
+ public void testApplicationStarts() {
+ System.setProperty("KEY_STORE_PASSWORD", "password");
+ BabelApplication.main(new String[] {});
+ BabelApplication.exit();
+ }
+
+ @Test
+ public void testApplicationStartsWithObfuscatedPassword() {
+ System.setProperty("KEY_STORE_PASSWORD", Password.obfuscate("password"));
+ BabelApplication.main(new String[] {});
+ BabelApplication.exit();
+ }
+
+ @Test
+ public void testApplicationWithNullArgs() {
+ System.setProperty("KEY_STORE_PASSWORD", "test");
+ expectedEx.expect(IllegalArgumentException.class);
+ expectedEx.expectMessage("Args must not be null");
+ BabelApplication.main(null);
+ }
+
+ @Test
+ public void testApplicationWithEmptyKeyStorePassword() {
+ System.setProperty("KEY_STORE_PASSWORD", "");
+ expectedEx.expect(IllegalArgumentException.class);
+ expectedEx.expectMessage("roperty KEY_STORE_PASSWORD not set");
+ BabelApplication.main(new String[] {});
+ }
+
+ @Test
+ public void testApplicationWithNullKeyStorePassword() {
+ System.clearProperty("KEY_STORE_PASSWORD");
+ expectedEx.expect(IllegalArgumentException.class);
+ expectedEx.expectMessage("roperty KEY_STORE_PASSWORD not set");
+ BabelApplication.main(new String[] {});
+ }
+
+ @Test
+ public void testApplicationWithIncorrectKeyStorePassword() {
+ System.setProperty("KEY_STORE_PASSWORD", "test");
+ final CauseMatcher expectedCause = new CauseMatcher(IOException.class, "password was incorrect");
+ expectedEx.expectCause(expectedCause);
+ BabelApplication.main(new String[] {});
+ }
+
+ private static class CauseMatcher extends TypeSafeMatcher<Throwable> {
+
+ private final Class<? extends Throwable> type;
+ private final String expectedMessage;
+
+ public CauseMatcher(Class<? extends Throwable> type, String expectedMessage) {
+ this.type = type;
+ this.expectedMessage = expectedMessage;
+ }
+
+ @Override
+ protected boolean matchesSafely(Throwable item) {
+ return item.getClass().isAssignableFrom(type) && item.getMessage().contains(expectedMessage);
+ }
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendValue(type).appendText(" and message ").appendValue(expectedMessage);
+ }
+ }
+
+}
/**
* Call the extractor with the specified arguments and assert that an exception is thrown.
*
- * @param archive the compressed archive in the form of a byte array, expected to contain one or more YAML files
- * @param name the name of the archive
- * @param version the version of the archive
- * @param expectedErrorMessage the text of the InvalidArchiveException thrown by the extractor
+ * @param archive
+ * the compressed archive in the form of a byte array, expected to contain one or more YAML files
+ * @param name
+ * the name of the archive
+ * @param version
+ * the version of the archive
+ * @param expectedErrorMessage
+ * the text of the InvalidArchiveException thrown by the extractor
*/
private void invalidArgumentsTest(byte[] archive, String name, String version, String expectedErrorMessage) {
try {
* Check that each message can be logged and that (by implication of successful logging) there is a corresponding
* resource (message format).
*
- * @throws IOException if the log files cannot be read
+ * @throws IOException
+ * if the log files cannot be read
*/
@Test
public void logAllMessages() throws IOException {
Logger logger = LogHelper.INSTANCE;
LogReader errorReader = new LogReader(LogHelper.getLogDirectory(), "error");
LogReader debugReader = new LogReader(LogHelper.getLogDirectory(), "debug");
- String[] args = { "1", "2", "3", "4" };
+ String[] args = {"1", "2", "3", "4"};
for (ApplicationMsgs msg : Arrays.asList(ApplicationMsgs.values())) {
if (msg.name().endsWith("ERROR")) {
logger.error(msg, args);
* Check that each message can be logged and that (by implication of successful logging) there is a corresponding
* resource (message format).
*
- * @throws IOException if the log file cannot be read
+ * @throws IOException
+ * if the log file cannot be read
*/
@Test
public void logDebugMessages() throws IOException {
/**
* Check logAudit with HTTP headers.
*
- * @throws IOException if the log file cannot be read
+ * @throws IOException
+ * if the log file cannot be read
*/
@Test
public void logAuditMessage() throws IOException {
/**
* Check logAudit with no HTTP headers.
*
- * @throws IOException if the log file cannot be read
+ * @throws IOException
+ * if the log file cannot be read
*/
@Test
public void logAuditMessageWithoutHeaders() throws IOException {
/**
* Check logMetrics.
*
- * @throws IOException if the log file cannot be read
+ * @throws IOException
+ * if the log file cannot be read
*/
@Test
public void logMetricsMessage() throws IOException {
/**
* Call a logger method which is expected to throw an UnsupportedOperationException.
*
- * @param logMethod the logger method to invoke
- * @param dummyMsg any Application Message enumeration value
+ * @param logMethod
+ * the logger method to invoke
+ * @param dummyMsg
+ * any Application Message enumeration value
*/
private void callUnsupportedOperationMethod(TriConsumer<Enum<?>, LogFields, String[]> logMethod,
ApplicationMsgs dummyMsg) {
try {
- logMethod.accept(dummyMsg, new LogFields(), new String[] { "" });
+ logMethod.accept(dummyMsg, new LogFields(), new String[] {""});
org.junit.Assert.fail("method should have thrown execption"); // NOSONAR as code not reached
} catch (UnsupportedOperationException e) {
// Expected to reach here
/**
* Assert that a log message was logged to the expected log file at the expected severity.
*
- * @param msg the Application Message enumeration value
- * @param reader the log reader for the message
- * @param severity log level
- * @throws IOException if the log file cannot be read
+ * @param msg
+ * the Application Message enumeration value
+ * @param reader
+ * the log reader for the message
+ * @param severity
+ * log level
+ * @throws IOException
+ * if the log file cannot be read
*/
private void validateLoggedMessage(ApplicationMsgs msg, LogReader reader, String severity) throws IOException {
String str = reader.getNewLines();
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import org.junit.Test;
import org.mockito.Mockito;
+import org.onap.aai.babel.util.ArtifactTestUtils;
+import org.onap.aai.babel.util.Resources;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil;
import org.onap.aai.babel.xml.generator.data.WidgetMapping;
import org.onap.aai.babel.xml.generator.model.Resource;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
+import org.onap.aai.babel.xml.generator.model.WidgetType;
import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
import org.onap.sdc.toscaparser.api.Group;
import org.onap.sdc.toscaparser.api.NodeTemplate;
private static final String TEST_UUID = "1234";
+ /**
+ * Initialize the Generator with an invalid artifact generator properties file path.
+ *
+ * @throws IOException
+ * if an error occurs reading the configuration properties
+ */
+ @Test(expected = IllegalArgumentException.class)
+ public void testMissingPropertiesFile() throws IOException {
+ System.setProperty(ArtifactGeneratorToscaParser.PROPERTY_ARTIFACT_GENERATOR_CONFIG_FILE, "non-existent.file");
+ ArtifactGeneratorToscaParser.initWidgetConfiguration();
+ }
+
+ /**
+ * Initialize the Generator with an invalid mappings file path.
+ *
+ * @throws IOException
+ * if the file content could not be read successfully
+ */
+ @Test(expected = IllegalArgumentException.class)
+ public void testMissingMappingsFile() throws IOException {
+ ArtifactGeneratorToscaParser.initToscaMappingsConfiguration("non-existent.file");
+ }
+
+ /**
+ * Initialize the Generator with no Widget Mappings content.
+ *
+ * @throws IOException
+ * if the file content could not be read successfully
+ */
+ @Test(expected = IOException.class)
+ public void testMissingMappingsContent() throws IOException {
+ String invalidJson = new ArtifactTestUtils().getResourcePath(Resources.EMPTY_TOSCA_MAPPING_CONFIG);
+ ArtifactGeneratorToscaParser.initToscaMappingsConfiguration(invalidJson);
+ }
+
+ /**
+ * Initialize the Generator with invalid Widget Mappings content.
+ *
+ * @throws IOException
+ * if the file content could not be read successfully
+ */
+ @Test(expected = IOException.class)
+ public void testInvalidMappingsContent() throws IOException {
+ String invalidJson = new ArtifactTestUtils().getResourcePath(Resources.INVALID_TOSCA_MAPPING_CONFIG);
+ ArtifactGeneratorToscaParser.initToscaMappingsConfiguration(invalidJson);
+ }
+
/**
* Process an Allotted Resource that does not have a Providing Service.
*/
@Test(expected = IllegalArgumentException.class)
public void testMissingProvidingService() {
List<NodeTemplate> nodeTemplateList = Collections.singletonList(buildNodeTemplate("name", "BlockStorage"));
- new ArtifactGeneratorToscaParser(null).processResourceModels(new Resource(Type.ALLOTTED_RESOURCE, true),
- nodeTemplateList);
+ new ArtifactGeneratorToscaParser(null)
+ .processResourceModels(new Resource(WidgetType.valueOf("ALLOTTED_RESOURCE"), true), nodeTemplateList);
}
/**
public void testAddResourceNotProvidingService() {
List<NodeTemplate> nodeTemplateList = Collections.singletonList(buildNodeTemplate("testCR", "CR"));
// Create any Resource to which the CR can be added
- final Resource dummyResource = new Resource(Type.ALLOTTED_RESOURCE, true);
+ final Resource dummyResource = new Resource(WidgetType.valueOf("ALLOTTED_RESOURCE"), true);
new ArtifactGeneratorToscaParser(null).processResourceModels(dummyResource, nodeTemplateList);
}
/**
- * Initialise the Artifact Generator Widget Mapping config with incomplete data.
+ * Initialize the Artifact Generator Widget Mapping config with incomplete data (no type).
+ *
+ * @throws IOException
+ * if a WidgetMapping is invalid
*/
- @Test(expected = IllegalArgumentException.class)
- public void testToscaMappingWithoutType() {
+ @Test(expected = IOException.class)
+ public void testToscaMappingWithoutType() throws IOException {
WidgetMapping invalidMapping = new WidgetMapping();
invalidMapping.setType(null);
WidgetConfigurationUtil.setWidgetMappings(Collections.singletonList(invalidMapping));
}
/**
- * Initialise the Artifact Generator Widget Mapping config with incomplete data.
+ * Initialize the Artifact Generator Widget Mapping config with invalid data (type value).
+ *
+ * @throws IOException
+ * if a WidgetMapping is invalid
*/
- @Test(expected = IllegalArgumentException.class)
- public void testToscaMappingWithoutWidget() {
+ @Test(expected = IOException.class)
+ public void testToscaMappingWithInvalidType() throws IOException {
+ WidgetMapping invalidMapping = new WidgetMapping();
+ invalidMapping.setType("invalid");
+ WidgetConfigurationUtil.setWidgetMappings(Collections.singletonList(invalidMapping));
+ }
+
+ /**
+ * Initialize the Artifact Generator Widget Mapping config with incomplete data (no widget name).
+ *
+ * @throws IOException
+ * if a WidgetMapping is invalid
+ */
+ @Test(expected = IOException.class)
+ public void testToscaMappingWithoutWidget() throws IOException {
WidgetMapping invalidMapping = new WidgetMapping();
invalidMapping.setWidget(null);
WidgetConfigurationUtil.setWidgetMappings(Collections.singletonList(invalidMapping));
/**
* Process a dummy Group object for a Service Resource.
+ *
+ * @throws XmlArtifactGenerationException
+ * if there is no configuration defined for a member Widget of an instance group
+ * @throws IOException
+ * if the widget mappings cannot be loaded
*/
@Test
- public void testInstanceGroups() {
+ public void testInstanceGroups() throws XmlArtifactGenerationException, IOException {
+ new ArtifactTestUtils().loadWidgetMappings();
+
final String instanceGroupType = "org.openecomp.groups.ResourceInstanceGroup";
WidgetConfigurationUtil.setSupportedInstanceGroups(Collections.singletonList(instanceGroupType));
Mockito.when(helper.getGroupsOfOriginOfNodeTemplate(serviceNodeTemplate)).thenReturn(groups);
ArtifactGeneratorToscaParser parser = new ArtifactGeneratorToscaParser(helper);
- List<Resource> resources =
- parser.processInstanceGroups(new Resource(Type.INSTANCE_GROUP, true), serviceNodeTemplate);
+ Resource groupResource = new Resource(WidgetType.valueOf("INSTANCE_GROUP"), true);
+ List<Resource> resources = parser.processInstanceGroups(groupResource, serviceNodeTemplate);
assertThat(resources.size(), is(1));
Resource resource = resources.get(0);
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import java.io.IOException;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.onap.aai.babel.csar.extractor.InvalidArchiveException;
import org.onap.aai.babel.testdata.CsarTest;
import org.onap.aai.babel.util.ArtifactTestUtils;
+import org.onap.aai.babel.util.Resources;
import org.onap.aai.babel.xml.generator.api.AaiArtifactGenerator;
import org.onap.aai.babel.xml.generator.data.AdditionalParams;
-import org.onap.aai.babel.xml.generator.data.Artifact;
import org.onap.aai.babel.xml.generator.data.GenerationData;
/**
*/
public class TestToscaParser {
- static {
- if (System.getProperty("APP_HOME") == null) {
- System.setProperty("APP_HOME", ".");
- }
- }
-
@Before
public void setup() {
new ArtifactTestUtils().setGeneratorSystemProperties();
}
@Test
- public void testParserWithCsarFile() throws IOException, InvalidArchiveException {
- List<Artifact> ymlFiles = CsarTest.VNF_VENDOR_CSAR.extractArtifacts();
- Map<String, String> additionalParams = new HashMap<>();
- additionalParams.put(AdditionalParams.SERVICE_VERSION.getName(), "1.0");
+ public void testParserWithInvalidMappings() throws IOException, InvalidArchiveException {
+ System.setProperty(ArtifactGeneratorToscaParser.PROPERTY_TOSCA_MAPPING_FILE,
+ new ArtifactTestUtils().getResourcePath(Resources.INVALID_TOSCA_MAPPING_CONFIG));
- AaiArtifactGenerator generator = new AaiArtifactGenerator();
- GenerationData data =
- generator.generateArtifact(CsarTest.VNF_VENDOR_CSAR.getContent(), ymlFiles, additionalParams);
+ GenerationData data = generateArtifactsFromCsarFile();
+ assertThat("Number of errors produced " + data.getErrorData(), data.getErrorData().size(), is(equalTo(1)));
+ assertThat("Number of resources generated", data.getResultData().size(), is(equalTo(0)));
+ }
- assertThat("Number of errors produced", data.getErrorData().size(), is(equalTo(0)));
+ @Test
+ public void testParserWithCsarFile() throws IOException, InvalidArchiveException {
+ GenerationData data = generateArtifactsFromCsarFile();
+ assertThat("Number of errors produced " + data.getErrorData(), data.getErrorData().size(), is(equalTo(0)));
assertThat("Number of resources generated", data.getResultData().size(), is(equalTo(2)));
}
+ /**
+ * Invoke the generator with a sample CSAR file.
+ *
+ * @return the generated AAI Artifacts
+ * @throws InvalidArchiveException
+ * if the test CSAR file is invalid
+ * @throws IOException
+ * if there are I/O errors reading the CSAR content
+ */
+ private GenerationData generateArtifactsFromCsarFile() throws InvalidArchiveException, IOException {
+ Map<String, String> additionalParams = new HashMap<>();
+ additionalParams.put(AdditionalParams.SERVICE_VERSION.getName(), "1.0");
+ return new AaiArtifactGenerator().generateArtifact(CsarTest.VNF_VENDOR_CSAR.getContent(),
+ CsarTest.VNF_VENDOR_CSAR.extractArtifacts(), additionalParams);
+ }
}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
private static final String INCORRECT_CSAR_NAME = "the_name_of_the_csar_file.csar";
private static final String SERVICE_VERSION = "1.0";
- static {
- if (System.getProperty("APP_HOME") == null) {
- System.setProperty("APP_HOME", ".");
- }
- }
-
// The class to be tested.
private CsarToXmlConverter converter;
*/
@Test
public void testArtifactGeneratorConfigMissing() throws CsarConverterException, IOException {
- exception.expect(CsarConverterException.class);
- exception.expectMessage("Cannot generate artifacts. System property artifactgenerator.config not configured");
+ exception.expect(IllegalArgumentException.class);
+ exception.expectMessage("Cannot generate artifacts. System property "
+ + ArtifactGeneratorToscaParser.PROPERTY_ARTIFACT_GENERATOR_CONFIG_FILE + " not configured");
// Unset the required system property
System.clearProperty(ArtifactGeneratorToscaParser.PROPERTY_ARTIFACT_GENERATOR_CONFIG_FILE);
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
public class TestGenerateArtifactsServiceImpl {
static {
- if (System.getProperty("APP_HOME") == null) {
- System.setProperty("APP_HOME", ".");
- }
System.setProperty("CONFIG_HOME", "src/test/resources");
}
-
@Inject
private AAIMicroServiceAuth auth;
@BeforeClass
public static void setup() {
new ArtifactTestUtils().setGeneratorSystemProperties();
-
}
@Test
public void testGenerateArtifacts() throws Exception {
Response response = processJsonRequest(CsarTest.VNF_VENDOR_CSAR);
- assertThat(response.getStatus(), is(Response.Status.OK.getStatusCode()));
+ assertThat(response.toString(), response.getStatus(), is(Response.Status.OK.getStatusCode()));
assertThat(response.getEntity(), is(getResponseJson("response.json")));
}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
private static final String CSAR_INPUTS_FOLDER = "compressedArtifacts/";
/**
- * Initialise System Properties for test configuration files.
+ * Initialize System Properties for test configuration files.
*/
public void setGeneratorSystemProperties() {
System.setProperty(ArtifactGeneratorToscaParser.PROPERTY_ARTIFACT_GENERATOR_CONFIG_FILE,
WidgetConfigurationUtil.setConfig(getResourceAsProperties(Resources.ARTIFACT_GENERATOR_CONFIG));
}
+ /**
+ * Load the Widget type mappings (resource).
+ *
+ * @throws IOException
+ * if the configuration file is not loaded
+ */
+ public void loadWidgetMappings() throws IOException {
+ ArtifactGeneratorToscaParser.initToscaMappingsConfiguration(getResourcePath(Resources.TOSCA_MAPPING_CONFIG));
+ }
+
/**
* Specific test method for the YAML Extractor test.
*
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.babel.util;
/**
public static final String ARTIFACT_GENERATOR_CONFIG = "artifact-generator.properties";
public static final String TOSCA_MAPPING_CONFIG = "tosca-mappings.json";
+ public static final String EMPTY_TOSCA_MAPPING_CONFIG = "empty-tosca-mappings.json";
+ public static final String INVALID_TOSCA_MAPPING_CONFIG = "invalid-tosca-mappings.json";
}
--- /dev/null
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aai.babel.xml.generator;
+
+import java.io.IOException;
+import java.util.Collections;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.aai.babel.testdata.CsarTest;
+import org.onap.aai.babel.util.ArtifactTestUtils;
+import org.onap.aai.babel.xml.generator.data.Artifact;
+
+/**
+ * Direct tests of the @{link ModelGenerator} implementation class (to improve code coverage). Not all methods are
+ * tested here. Most use cases are covered by direct tests of @{link CsarToXmlConverter}.
+ */
+public class TestModelGenerator {
+
+ static {
+ System.setProperty("APP_HOME", ".");
+ }
+
+ @Before
+ public void setup() {
+ new ArtifactTestUtils().setGeneratorSystemProperties();
+ }
+
+ @Test
+ public void testDefaultServiceVersion() throws XmlArtifactGenerationException, IOException {
+ Artifact ymlFile = new Artifact(null, null, null, null);
+ new ModelGenerator().generateArtifacts(CsarTest.SD_WAN_CSAR_FILE.getContent(),
+ Collections.singletonList(ymlFile));
+ }
+
+
+}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2018 Nokia Networks Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2018 Nokia Networks Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* 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
+ * 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,
assertThat(result, is(EMPTY_BYTE_ARRAY));
}
- @Test
- public void shouldDecodeUsingBase64() {
- byte[] input = Base64.getEncoder().encode(TEST_BYTES);
- byte[] expected = Base64.getDecoder().decode(input);
-
- byte[] result = GeneratorUtil.decode(input);
-
- assertThat(result, is(expected));
- }
-
- @Test
- public void shouldReturnEmptyByteArrayWhenNullPassedToDecode() {
- byte[] result = GeneratorUtil.decode(null);
-
- assertThat(result, is(EMPTY_BYTE_ARRAY));
- }
-
@Test
public void shouldReturnNullWhenNullPassedToCheckSum() {
assertNull(GeneratorUtil.checkSum(null));
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import static org.junit.Assert.assertThat;
import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.junit.Before;
+import org.junit.BeforeClass;
import org.junit.Test;
-import org.onap.aai.babel.parser.ArtifactGeneratorToscaParser;
import org.onap.aai.babel.util.ArtifactTestUtils;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
-import org.onap.aai.babel.xml.generator.types.ModelType;
/**
* Direct tests of the Model abstract class (to improve code coverage). Not all methods are tested here. Some are
*/
public class TestModel {
- private Service serviceModel = new Service();
- private List<Resource> resourceModels =
- Arrays.asList(new Resource(Type.CR, true), new Resource(Type.INSTANCE_GROUP, true));
- private Widget widgetModel = new OamNetwork();
- private Model anonymousModel;
-
- static {
- System.setProperty("APP_HOME", ".");
- }
-
/**
- * Initialise the Artifact Generator with filtering and mapping configuration. Also Load the Widget to UUID mappings
- * from the Artifact Generator properties.
+ * Load the Widget Configuration, including the type mappings and the UUID mappings.
*
* @throws IOException
- * if the Artifact Generator properties file is not loaded
+ * if the mappings configuration cannot be loaded
*/
- @Before
- public void setup() throws IOException {
- ArtifactTestUtils utils = new ArtifactTestUtils();
- utils.setGeneratorSystemProperties();
-
- String configLocation = System.getProperty(ArtifactGeneratorToscaParser.PROPERTY_TOSCA_MAPPING_FILE);
- if (configLocation == null) {
- throw new IllegalArgumentException(
- String.format(ArtifactGeneratorToscaParser.GENERATOR_AAI_CONFIGLOCATION_NOT_FOUND, ArtifactGeneratorToscaParser.PROPERTY_TOSCA_MAPPING_FILE));
- }
-
- ArtifactGeneratorToscaParser.initToscaMappingsConfiguration(configLocation);
- utils.loadWidgetToUuidMappings();
-
- anonymousModel = new Model() {
- @Override
- public boolean addResource(Resource resource) {
- return false;
- }
-
- @Override
- public boolean addWidget(Widget resource) {
- return false;
- }
-
- @Override
- public Type getWidgetType() {
- return null;
- }
-
- @Override
- public Map<String, Object> getProperties() {
- return Collections.emptyMap();
- }
-
- @Override
- public boolean isResource() {
- return false;
- }
- };
+ @BeforeClass
+ public static void setup() throws IOException {
+ ArtifactTestUtils util = new ArtifactTestUtils();
+ util.loadWidgetToUuidMappings();
+ util.loadWidgetMappings();
}
@Test
assertThat(Model.getModelFor(""), is(nullValue()));
assertThat(Model.getModelFor("any.unknown.type"), is(nullValue()));
- assertMapping("org.openecomp.resource.vfc", Type.VSERVER);
- assertMapping("org.openecomp.resource.cp", Type.LINT);
- assertMapping("org.openecomp.cp", Type.LINT);
- assertMapping("org.openecomp.cp.some.suffix", Type.LINT);
- assertMapping("org.openecomp.resource.vl", Type.L3_NET);
- assertMapping("org.openecomp.resource.vf", Type.VF);
- assertMapping("org.openecomp.groups.vfmodule", Type.VFMODULE);
- assertMapping("org.openecomp.groups.VfModule", Type.VFMODULE);
- assertMapping("org.openecomp.resource.vfc.nodes.heat.cinder", Type.VOLUME);
- assertMapping("org.openecomp.nodes.PortMirroringConfiguration", "Configuration", Type.CONFIGURATION);
- assertMapping("any.string", "Configuration", Type.CONFIGURATION);
- assertMapping("org.openecomp.resource.cr.Kk1806Cr1", "CR", Type.CR);
- assertMapping("any.string", "CR", Type.CR);
-
- assertMapping("org.openecomp.resource.vfc", "an.unknown.type", Type.VSERVER);
+ assertMapping("org.openecomp.resource.vfc", WidgetType.valueOf("VSERVER"));
+ assertMapping("org.openecomp.resource.cp", WidgetType.valueOf("LINT"));
+ assertMapping("org.openecomp.cp", WidgetType.valueOf("LINT"));
+ assertMapping("org.openecomp.cp.some.suffix", WidgetType.valueOf("LINT"));
+ assertMapping("org.openecomp.resource.vl", WidgetType.valueOf("L3_NET"));
+ assertMapping("org.openecomp.resource.vf", WidgetType.valueOf("VF"));
+ assertMapping("org.openecomp.groups.vfmodule", WidgetType.valueOf("VFMODULE"));
+ assertMapping("org.openecomp.groups.VfModule", WidgetType.valueOf("VFMODULE"));
+ assertMapping("org.openecomp.resource.vfc.nodes.heat.cinder", WidgetType.valueOf("VOLUME"));
+ assertMapping("org.openecomp.nodes.PortMirroringConfiguration", "Configuration",
+ WidgetType.valueOf("CONFIGURATION"));
+ assertMapping("any.string", "Configuration", WidgetType.valueOf("CONFIGURATION"));
+ assertMapping("org.openecomp.resource.cr.Kk1806Cr1", "CR", WidgetType.valueOf("CR"));
+ assertMapping("any.string", "CR", WidgetType.valueOf("CR"));
+
+ assertMapping("org.openecomp.resource.vfc", "an.unknown.type", WidgetType.valueOf("VSERVER"));
}
/**
* Assert that the TOSCA type String is mapped to the expected Widget Type.
*
* @param toscaType
- * the TOSCA type or prefix
+ * the TOSCA type or prefix
* @param widgetType
- * the type of Widget expected from the mappings
+ * the type of Widget expected from the mappings
*/
- private void assertMapping(String toscaType, Type widgetType) {
+ private void assertMapping(String toscaType, WidgetType widgetType) {
assertThat(Model.getModelFor(toscaType).getWidgetType(), is(widgetType));
}
* Assert that the TOSCA metadata type is mapped to the expected Widget Type.
*
* @param toscaType
- * the name (or name prefix) of the TOSCA type
+ * the name (or name prefix) of the TOSCA type
* @param metadataType
- * the type specified in the TOSCA metadata
+ * the type specified in the TOSCA metadata
* @param widgetType
- * the type of Widget expected from the mappings
+ * the type of Widget expected from the mappings
*/
- private void assertMapping(String toscaType, String metadataType, Type widgetType) {
+ private void assertMapping(String toscaType, String metadataType, WidgetType widgetType) {
assertThat(Model.getModelFor(toscaType, metadataType).getWidgetType(), is(widgetType));
}
- @Test
- public void testGetModelType() {
- assertThat(serviceModel.getModelType(), is(ModelType.SERVICE));
- for (Resource resourceModel : resourceModels) {
- assertThat(resourceModel.getModelType(), is(ModelType.RESOURCE));
- }
- assertThat(widgetModel.getModelType(), is(ModelType.WIDGET));
- assertThat(anonymousModel.getModelType(), is(nullValue()));
- }
-
- @Test
- public void testGetModelNameVersionId() {
- assertThat(anonymousModel.getModelNameVersionId(), is(nullValue()));
- }
-
- @Test(expected = org.onap.aai.babel.xml.generator.error.IllegalAccessException.class)
- public void testGetModelNameVersionIdIsUnsupported() {
- assertThat(widgetModel.getModelNameVersionId(), is(nullValue()));
- assertThat(resourceModels.get(0).getModelType(), is(ModelType.RESOURCE));
- assertThat(widgetModel.getModelType(), is(ModelType.WIDGET));
- assertThat(anonymousModel.getModelType(), is(nullValue()));
- }
-
}
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import org.junit.BeforeClass;
import org.junit.Test;
import org.onap.aai.babel.util.ArtifactTestUtils;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
/**
- * Direct tests of the VfModule Model class to improve code coverage.
+ * Direct tests of the VFMODULE Resource and Widget functionality to improve code coverage.
*/
public class TestVfModule {
- static {
- System.setProperty("APP_HOME", ".");
- }
-
+ /**
+ * Load the Widget Configuration, including the type mappings and the UUID mappings.
+ *
+ * @throws IOException
+ * if the mappings configuration cannot be loaded
+ */
@BeforeClass
public static void setup() throws IOException {
- new ArtifactTestUtils().loadWidgetToUuidMappings();
+ ArtifactTestUtils util = new ArtifactTestUtils();
+ util.loadWidgetToUuidMappings();
+ util.loadWidgetMappings();
}
/**
}
@Test
- public void testAddVServerWidgetToVf() {
- assertAddWidget(createNewVfModule(), Type.VSERVER);
+ public void testAddVServerWidgetToVf() throws XmlArtifactGenerationException {
+ assertAddWidget(createNewVfModule(), WidgetType.valueOf("VSERVER"));
}
@Test
- public void testAddServiceWidgetToVf() {
- assertAddWidget(createNewVfModule(), Type.SERVICE);
+ public void testAddServiceWidgetToVf() throws XmlArtifactGenerationException {
+ assertAddWidget(createNewVfModule(), WidgetType.valueOf("SERVICE"));
}
/**
* Add a new Widget to a VF Module, where the Widget is NOT set as a member. N.B. For the current VF Module
* implementation the actual Widget type is not important.
+ *
+ * @throws XmlArtifactGenerationException
+ * if the Widget mapping configuration is missing
*/
@Test
- public void testNonMemberWidgetToVf() {
+ public void testNonMemberWidgetToVf() throws XmlArtifactGenerationException {
Resource vfModule = createNewVfModule();
- assertThat(vfModule.addWidget(createNewWidget(Type.SERVICE)), is(false));
+ assertThat(vfModule.addWidget(createNewWidget(WidgetType.valueOf("SERVICE"))), is(false));
assertNumberOfWidgets(vfModule, 0);
}
/**
* OAM Network is specifically excluded from a VF Module.
+ *
+ * @throws XmlArtifactGenerationException
+ * if the Widget mapping configuration is missing
*/
@Test
- public void testAddOamNetworkWidgetToVf() {
+ public void testAddOamNetworkWidgetToVf() throws XmlArtifactGenerationException {
Resource vfModule = createNewVfModule();
- assertThat(createNewWidgetForModule(vfModule, Type.OAM_NETWORK), is(false));
+ assertThat(createNewWidgetForModule(vfModule, WidgetType.valueOf("OAM_NETWORK")), is(false));
assertNumberOfWidgets(vfModule, 0);
}
* <li>Add a Volume Widget</li>
* <li>Add a vserver Widget</li>
* <li>Check that the Volume Widget appears under the vserver</li>
+ *
+ * @throws XmlArtifactGenerationException
+ * if the Widget mapping configuration is missing
*/
@Test
- public void testAddVolumeWidgetToVf() {
+ public void testAddVolumeWidgetToVf() throws XmlArtifactGenerationException {
Resource vfModule = createNewVfModule();
// Adding a Volume widget has no effect until a vserver widget is added.
- assertAddWidget(vfModule, Type.VOLUME);
+ assertAddWidget(vfModule, WidgetType.valueOf("VOLUME"));
assertNumberOfWidgets(vfModule, 0);
final int vserverBaseWidgetCount = createVserverForVf(vfModule);
assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 1);
// Adding another instance of a vserver widget fails.
- assertFailToAddWidget(vfModule, Type.VSERVER);
+ assertFailToAddWidget(vfModule, WidgetType.valueOf("VSERVER"));
assertNumberOfWidgets(vfModule, 1);
// Adding another Volume widget is always treated as successful.
- assertAddWidget(vfModule, Type.VOLUME);
+ assertAddWidget(vfModule, WidgetType.valueOf("VOLUME"));
// Assert that no additional Widgets are actually present.
assertNumberOfWidgets(vfModule, 1);
assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 1);
* <li>Add an L-Interface Widget</li>
* <li>Add a vserver Widget</li>
* <li>Check that the L-Interface Widget appears under the vserver</li>
+ *
+ * @throws XmlArtifactGenerationException
+ * if the Widget mapping configuration is missing
*/
@Test
- public void testAddLinterfaceWidgetToVf() {
+ public void testAddLinterfaceWidgetToVf() throws XmlArtifactGenerationException {
Resource vfModule = createNewVfModule();
// Adding an L-Interface widget has no effect until a vserver widget is added.
- assertFailToAddWidget(vfModule, Type.LINT);
+ assertFailToAddWidget(vfModule, WidgetType.valueOf("LINT"));
assertNumberOfWidgets(vfModule, 0);
final int vserverBaseWidgetCount = createVserverForVf(vfModule);
assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 1);
// Adding another instance of a vserver widget fails.
- assertFailToAddWidget(vfModule, Type.VSERVER);
+ assertFailToAddWidget(vfModule, WidgetType.valueOf("VSERVER"));
assertNumberOfWidgets(vfModule, 1);
// Adding an L-Interface widget is always treated as successful when a vserver exists.
- assertAddWidget(vfModule, Type.LINT);
+ assertAddWidget(vfModule, WidgetType.valueOf("LINT"));
// Assert that no additional Widgets are actually present.
assertNumberOfWidgets(vfModule, 1);
assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 1);
* <li>Add an L-Interface Widget</li>
* <li>Add a vserver Widget</li>
* <li>Check that both Widgets appear under the vserver</li>
+ *
+ * @throws XmlArtifactGenerationException
+ * if the Widget mapping configuration is missing
*/
@Test
- public void testAddVolumeAndLinterfaceWidgetToVf() {
+ public void testAddVolumeAndLinterfaceWidgetToVf() throws XmlArtifactGenerationException {
Resource vfModule = createNewVfModule();
// Adding a Volume widget has no effect until a vserver widget is added.
- assertAddWidget(vfModule, Type.VOLUME);
+ assertAddWidget(vfModule, WidgetType.valueOf("VOLUME"));
assertNumberOfWidgets(vfModule, 0);
// Adding an L-Interface widget has no effect until a vserver widget is added.
- assertFailToAddWidget(vfModule, Type.LINT);
+ assertFailToAddWidget(vfModule, WidgetType.valueOf("LINT"));
assertNumberOfWidgets(vfModule, 0);
final int vserverBaseWidgetCount = createVserverForVf(vfModule);
assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 2);
// Adding another instance of a vserver widget fails.
- assertFailToAddWidget(vfModule, Type.VSERVER);
+ assertFailToAddWidget(vfModule, WidgetType.valueOf("VSERVER"));
assertNumberOfWidgets(vfModule, 1);
// Add new instances (with no effect).
- assertAddWidget(vfModule, Type.VOLUME);
- assertAddWidget(vfModule, Type.LINT);
+ assertAddWidget(vfModule, WidgetType.valueOf("VOLUME"));
+ assertAddWidget(vfModule, WidgetType.valueOf("LINT"));
// Assert that no additional Widgets are in fact present.
assertNumberOfWidgets(vfModule, 1);
assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 2);
* @param widgetType
* type of Widget to create
* @return a new Widget
+ * @throws XmlArtifactGenerationException
+ * if the Widget mapping configuration is missing
*/
- private Widget createNewWidget(Type widgetType) {
+ private Widget createNewWidget(WidgetType widgetType) throws XmlArtifactGenerationException {
return Widget.getWidget(widgetType);
}
* @return new VF Module resource
*/
private Resource createNewVfModule() {
- Resource vfModule = new Resource(Type.VFMODULE, true);
+ Resource vfModule = new Resource(WidgetType.valueOf("VFMODULE"), true);
assertNumberOfWidgets(vfModule, 0);
return vfModule;
}
* the VF Module to update
* @param widgetType
* the type of Widget to create and add
+ * @throws XmlArtifactGenerationException
+ * if the Widget mapping configuration is missing
*/
- private void assertAddWidget(Resource vfModule, Type widgetType) {
+ private void assertAddWidget(Resource vfModule, WidgetType widgetType) throws XmlArtifactGenerationException {
assertThat(createNewWidgetForModule(vfModule, widgetType), is(true));
}
* the VF Module
* @param widgetType
* the type of Widget to create and attempt to add
+ * @throws XmlArtifactGenerationException
+ * if the Widget mapping configuration is missing
*/
- private void assertFailToAddWidget(Resource vfModule, Type widgetType) {
+ private void assertFailToAddWidget(Resource vfModule, WidgetType widgetType) throws XmlArtifactGenerationException {
assertThat(createNewWidgetForModule(vfModule, widgetType), is(false));
}
* @param widgetType
* the type of Widget to create and attempt to add
* @return whether or not the Widget was added to the module
+ * @throws XmlArtifactGenerationException
+ * if the Widget mapping configuration is missing
*/
- private boolean createNewWidgetForModule(Resource vfModule, Type widgetType) {
+ private boolean createNewWidgetForModule(Resource vfModule, WidgetType widgetType)
+ throws XmlArtifactGenerationException {
Widget widget = createNewWidget(widgetType);
setWidgetAsMember(vfModule, widget);
return vfModule.addWidget(widget);
* @param vfModule
* the VF Module to update
* @return the number of Widgets present in the vserver on creation
+ * @throws XmlArtifactGenerationException
+ * if the Widget mapping configuration is missing
*/
- private int createVserverForVf(Resource vfModule) {
- VServerWidget vserverWidget = (VServerWidget) createNewWidget(Type.VSERVER);
+ private int createVserverForVf(Resource vfModule) throws XmlArtifactGenerationException {
+ Widget vserverWidget = createNewWidget(WidgetType.valueOf("VSERVER"));
assertNumberOfWidgets(vfModule, 0);
final int initialWidgetCount = addVserverToVf(vfModule, vserverWidget);
assertNumberOfWidgets(vfModule, 1);
* @param vserverWidget
* the Widget to add
* @return initial widget count for the vserver Widget
+ * @throws XmlArtifactGenerationException
+ * if the Widget mapping configuration is missing
*/
- private int addVserverToVf(Resource vfModule, VServerWidget vserverWidget) {
+ private int addVserverToVf(Resource vfModule, Widget vserverWidget) throws XmlArtifactGenerationException {
// A vserver (initially) has Flavor, Image, Tenant and Vfc.
final int initialWidgetCount = 4;
assertNumberOfWidgets(vserverWidget, initialWidgetCount);
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
package org.onap.aai.babel.xml.generator.model;
-import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import org.junit.BeforeClass;
import org.junit.Test;
import org.onap.aai.babel.util.ArtifactTestUtils;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
import org.onap.aai.babel.xml.generator.types.ModelType;
/**
*/
public class TestWidget {
- static {
- System.setProperty("APP_HOME", ".");
- }
-
/**
- * Load the Widget to UUID mappings from the Artifact Generator properties.
+ * Load the Widget Configuration, including the type mappings and the UUID mappings.
*
* @throws IOException
- * if the properties file is not loaded
+ * if the mappings configuration cannot be loaded
*/
@BeforeClass
public static void setup() throws IOException {
- new ArtifactTestUtils().loadWidgetToUuidMappings();
+ ArtifactTestUtils util = new ArtifactTestUtils();
+ util.loadWidgetToUuidMappings();
+ util.loadWidgetMappings();
}
@Test
- public void testGetWidgets() {
- assertThat(Widget.getWidget(Type.SERVICE), instanceOf(ServiceWidget.class));
- assertThat(Widget.getWidget(Type.VF), instanceOf(VfWidget.class));
- assertThat(Widget.getWidget(Type.VFC), instanceOf(VfcWidget.class));
- assertThat(Widget.getWidget(Type.VSERVER), instanceOf(VServerWidget.class));
- assertThat(Widget.getWidget(Type.VOLUME), instanceOf(VolumeWidget.class));
- assertThat(Widget.getWidget(Type.FLAVOR), instanceOf(FlavorWidget.class));
- assertThat(Widget.getWidget(Type.TENANT), instanceOf(TenantWidget.class));
- assertThat(Widget.getWidget(Type.VOLUME_GROUP), instanceOf(VolumeGroupWidget.class));
- assertThat(Widget.getWidget(Type.LINT), instanceOf(LIntfWidget.class));
- assertThat(Widget.getWidget(Type.L3_NET), instanceOf(L3NetworkWidget.class));
- assertThat(Widget.getWidget(Type.VFMODULE), instanceOf(VfModuleWidget.class));
- assertThat(Widget.getWidget(Type.IMAGE), instanceOf(ImageWidget.class));
- assertThat(Widget.getWidget(Type.OAM_NETWORK), instanceOf(OamNetwork.class));
- assertThat(Widget.getWidget(Type.ALLOTTED_RESOURCE), instanceOf(AllotedResourceWidget.class));
- assertThat(Widget.getWidget(Type.TUNNEL_XCONNECT), instanceOf(TunnelXconnectWidget.class));
- assertThat(Widget.getWidget(Type.CONFIGURATION), instanceOf(ConfigurationWidget.class));
+ public void testGetWidgets() throws XmlArtifactGenerationException {
+ Widget widget = Widget.getWidget(WidgetType.valueOf("SERVICE"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("service-instance"));
+ assertThat(widget.getDeleteFlag(), is(true));
+
+ widget = Widget.getWidget(WidgetType.valueOf("VF"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("generic-vnf"));
+ assertThat(widget.getDeleteFlag(), is(false));
+
+ widget = Widget.getWidget(WidgetType.valueOf("VFC"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("vnfc"));
+ assertThat(widget.getDeleteFlag(), is(true));
+
+ widget = Widget.getWidget(WidgetType.valueOf("VSERVER"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("vserver"));
+ assertThat(widget.getDeleteFlag(), is(true));
+
+ widget = Widget.getWidget(WidgetType.valueOf("VOLUME"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("volume"));
+ assertThat(widget.getDeleteFlag(), is(true));
+
+ widget = Widget.getWidget(WidgetType.valueOf("FLAVOR"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("flavor"));
+ assertThat(widget.getDeleteFlag(), is(false));
+
+ widget = Widget.getWidget(WidgetType.valueOf("TENANT"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("tenant"));
+ assertThat(widget.getDeleteFlag(), is(false));
+
+ widget = Widget.getWidget(WidgetType.valueOf("VOLUME_GROUP"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("volume-group"));
+ assertThat(widget.getDeleteFlag(), is(true));
+
+ widget = Widget.getWidget(WidgetType.valueOf("LINT"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("l-interface"));
+ assertThat(widget.getDeleteFlag(), is(true));
+
+ widget = Widget.getWidget(WidgetType.valueOf("L3_NET"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("l3-network"));
+ assertThat(widget.getDeleteFlag(), is(true));
+
+ widget = Widget.getWidget(WidgetType.valueOf("VFMODULE"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("vf-module"));
+ assertThat(widget.getDeleteFlag(), is(true));
+
+ widget = Widget.getWidget(WidgetType.valueOf("IMAGE"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("image"));
+ assertThat(widget.getDeleteFlag(), is(false));
+
+ widget = Widget.getWidget(WidgetType.valueOf("OAM_NETWORK"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("oam-network"));
+ assertThat(widget.getDeleteFlag(), is(true));
+
+ widget = Widget.getWidget(WidgetType.valueOf("ALLOTTED_RESOURCE"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("allotted-resource"));
+ assertThat(widget.getDeleteFlag(), is(true));
+
+ widget = Widget.getWidget(WidgetType.valueOf("TUNNEL_XCONNECT"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("tunnel-xconnect"));
+ assertThat(widget.getDeleteFlag(), is(true));
+
+ widget = Widget.getWidget(WidgetType.valueOf("CONFIGURATION"));
+ assertThat(widget.getType(), is(ModelType.WIDGET));
+ assertThat(widget.getName(), is("configuration"));
+ assertThat(widget.getDeleteFlag(), is(true));
}
@Test
- public void testWidgetMethods() {
- Widget widget = new ServiceWidget();
+ public void testWidgetMethods() throws XmlArtifactGenerationException {
+ Widget widget = new Widget(WidgetType.valueOf("SERVICE"), "service-instance", true);
assertThat(widget.getType(), is(ModelType.WIDGET));
assertThat(widget.getWidgetId(), is("service-instance-invariant-id"));
- assertThat(widget.addWidget(new TenantWidget()), is(true));
+ assertThat(widget.addWidget(Widget.getWidget(WidgetType.valueOf("TENANT"))), is(true));
assertThat(widget.memberOf(null), is(false));
assertThat(widget.memberOf(Collections.emptyList()), is(false));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testGetUnknownWidget() throws XmlArtifactGenerationException {
+ WidgetType.valueOf("invalid-widget-name");
+ }
+
+ /**
+ * Try to get the Widget object for an unsupported (non-configured) type.
+ *
+ * @throws XmlArtifactGenerationException
+ * if there is no configuration defined for the specified Widget type
+ */
+ @Test(expected = XmlArtifactGenerationException.class)
+ public void testGetDynamicWidget() throws XmlArtifactGenerationException {
+ Widget.getWidget(new WidgetType(null));
+ }
+
+ @Test(expected = org.onap.aai.babel.xml.generator.error.IllegalAccessException.class)
+ public void testAddResourceIsUnsupported() throws XmlArtifactGenerationException {
+ Widget.getWidget(WidgetType.valueOf("OAM_NETWORK")).addResource(null);
+ }
- widget = new VolumeGroupWidget(); // just for variety
- assertThat(widget.getWidgetType(), is(nullValue()));
+ @Test(expected = IllegalArgumentException.class)
+ public void testGetVersionIdForUknownWidget() {
+ new Widget(new WidgetType("test"), null, false).getId();
}
+ @Test(expected = IllegalArgumentException.class)
+ public void testGetInvariantIdForUknownWidget() {
+ new Widget(new WidgetType("test"), null, false).getWidgetId();
+ }
+
+ // Call Widget methods which are not supported, purely for code coverage.
+
@Test(expected = org.onap.aai.babel.xml.generator.error.IllegalAccessException.class)
- public void testAddResourceIsUnsupported() {
- new OamNetwork().addResource(null);
+ public void testGetModelNameVersionIdIsUnsupported() {
+ Widget widgetModel = new Widget(WidgetType.valueOf("OAM_NETWORK"), "oam-network", true);
+ assertThat(widgetModel.getModelNameVersionId(), is(nullValue()));
}
+
+ @Test(expected = org.onap.aai.babel.xml.generator.error.IllegalAccessException.class)
+ public void testGetModelTypeNameIsUnsupported() {
+ Widget widgetModel = new Widget(WidgetType.valueOf("OAM_NETWORK"), "oam-network", true);
+ assertThat(widgetModel.getModelTypeName(), is(nullValue()));
+ }
+
+ @Test(expected = org.onap.aai.babel.xml.generator.error.IllegalAccessException.class)
+ public void testGetModelIdIsUnsupported() {
+ Widget widgetModel = new Widget(WidgetType.valueOf("OAM_NETWORK"), "oam-network", true);
+ assertThat(widgetModel.getModelId(), is(nullValue()));
+ }
+
}
--- /dev/null
+{"roles": [
+ {
+ "name": "nofuncauth",
+ "functions": [{
+ "name": "nofuncutil"
+ }],
+ "users": [{
+ "user": "aai",
+ "pass": "OBF:1u2a1t2v1vgb1s3g1s3m1vgj1t3b1u30"
+ }]
+ }
+]}
--- /dev/null
+test file that does not contain valid JSON content
\ No newline at end of file
"org.openecomp.groups.VfcInstanceGroup",
"org.openecomp.groups.ResourceInstanceGroup"
],
+ "widgetTypes": [
+ {
+ "type": "SERVICE",
+ "name": "service-instance",
+ "deleteFlag": true
+ },
+ {
+ "type": "VF",
+ "name": "generic-vnf",
+ "deleteFlag": false
+ },
+ {
+ "type": "VFC",
+ "name": "vnfc",
+ "deleteFlag": true
+ },
+ {
+ "type": "VSERVER",
+ "name": "vserver",
+ "deleteFlag": true
+ },
+ {
+ "type": "VOLUME",
+ "name": "volume",
+ "deleteFlag": true
+ },
+ {
+ "type": "FLAVOR",
+ "name": "flavor",
+ "deleteFlag": false
+ },
+ {
+ "type": "TENANT",
+ "name": "tenant",
+ "deleteFlag": false
+ },
+ {
+ "type": "VOLUME_GROUP",
+ "name": "volume-group",
+ "deleteFlag": true
+ },
+ {
+ "type": "LINT",
+ "name": "l-interface",
+ "deleteFlag": true
+ },
+ {
+ "type": "L3_NET",
+ "name": "l3-network",
+ "deleteFlag": true
+ },
+ {
+ "type": "VFMODULE",
+ "name": "vf-module",
+ "deleteFlag": true
+ },
+ {
+ "type": "IMAGE",
+ "name": "image",
+ "deleteFlag": false
+ },
+ {
+ "type": "OAM_NETWORK",
+ "name": "oam-network",
+ "deleteFlag": true
+ },
+ {
+ "type": "ALLOTTED_RESOURCE",
+ "name": "allotted-resource",
+ "deleteFlag": true
+ },
+ {
+ "type": "TUNNEL_XCONNECT",
+ "name": "tunnel-xconnect",
+ "deleteFlag": true
+ },
+ {
+ "type": "CONFIGURATION",
+ "name": "configuration",
+ "deleteFlag": true
+ },
+ {
+ "type": "CR",
+ "name": "cr",
+ "deleteFlag": true
+ },
+ {
+ "type": "INSTANCE_GROUP",
+ "name": "instance-group",
+ "deleteFlag": true
+ }
+ ],
"widgetMappings": [
{
"prefix": "org.openecomp.resource.vfc",