public void TraverseNodeTypesInheritance_Traverses_Nodes_From_Root_To_Its_Derived_Node_Types() { // Arrange var serviceTemplate = new ToscaServiceTemplate(); serviceTemplate.NodeTypes.Add("device", new ToscaNodeType()); serviceTemplate.NodeTypes.Add("switch", new ToscaNodeType { DerivedFrom = "device" }); serviceTemplate.NodeTypes.Add("router", new ToscaNodeType { DerivedFrom = "device" }); var cloudServiceArchive = new ToscaCloudServiceArchive(new ToscaMetadata()); cloudServiceArchive.AddToscaServiceTemplate("sample.yaml", serviceTemplate); // Act var discoveredNodeTypeNames = new List <string>(); cloudServiceArchive.TraverseNodeTypesInheritance( (nodeTypeName, nodeType) => { discoveredNodeTypeNames.Add(nodeTypeName); }); // Assert discoveredNodeTypeNames.ShouldBeEquivalentTo(new[] { "tosca.nodes.Root", "tosca.nodes.BlockStorage", "tosca.nodes.Compute", "device", "switch", "router" }); }
public void TraverseNodeTypesByRequirements_Should_Throw_Exception_When_NodeType_ToStart_NotFound() { // Arrange var serviceTemplate = new ToscaServiceTemplate { ToscaDefinitionsVersion = "tosca_simple_yaml_1_0" }; serviceTemplate.NodeTypes.Add("tosca.nodes.device", new ToscaNodeType()); var cloudServiceArchive = new ToscaCloudServiceArchive(new ToscaMetadata { CsarVersion = new Version(1, 1), EntryDefinitions = "not_existing.yaml", ToscaMetaFileVersion = new Version(1, 1), CreatedBy = "Anonymous" }); cloudServiceArchive.AddToscaServiceTemplate("sample.yaml", serviceTemplate); // Act Action action = () => cloudServiceArchive.TraverseNodeTypesByRequirements("NOT_EXISTING", (nodeTypeName, nodeType) => { }); // Assert action.ShouldThrow <ToscaNodeTypeNotFoundException>().WithMessage("Node type 'NOT_EXISTING' not found"); }
public void Validation_Shall_Pass_When_Complex_Data_Type_Consists_Of_Built_In_Type() { var toscaMetadata = new ToscaMetadata { CreatedBy = "Anonymous", CsarVersion = new Version(1, 1), EntryDefinitions = "tosca.yaml", ToscaMetaFileVersion = new Version(1, 0) }; var cloudServiceArchive = new ToscaCloudServiceArchive(toscaMetadata); var toscaAsString = @" tosca_definitions_version: tosca_simple_yaml_1_0 data_types: tosca.datatypes.Complex: properties: real: type: integer"; using (var memoryStream = toscaAsString.ToMemoryStream()) { // Act var serviceTemplate = ToscaServiceTemplate.Load(memoryStream); cloudServiceArchive.AddToscaServiceTemplate("tosca.yaml", serviceTemplate); // Assert List <ValidationResult> results; cloudServiceArchive.TryValidate(out results).Should().BeTrue(string.Join(Environment.NewLine, results)); } }
public void Base_Property_Set_To_NodeType_Instance_Of_Derived_From() { // Arrange var deviceNodeType = new ToscaNodeType(); deviceNodeType.Properties.Add("vendor", new ToscaProperty { Type = "string" }); var switchNodeType = new ToscaNodeType { DerivedFrom = "tosca.nodes.Device" }; switchNodeType.Properties.Add("speed", new ToscaProperty { Type = "integer" }); var serviceTemplate = new ToscaServiceTemplate { ToscaDefinitionsVersion = "tosca_simple_yaml_1_0" }; serviceTemplate.NodeTypes.Add("tosca.nodes.Switch", switchNodeType); serviceTemplate.NodeTypes.Add("tosca.nodes.Device", deviceNodeType); // Act var cloudServiceArchive = new ToscaCloudServiceArchive(new ToscaMetadata()); cloudServiceArchive.AddToscaServiceTemplate("tosca.yaml", serviceTemplate); // Assert switchNodeType.GetDerivedFromEntity().Properties.Should().ContainKey("vendor"); }
public void RelationshipTypes_Initialized_To_Empty_Dictionary() { var toscaSimpleProfile = new ToscaServiceTemplate(); toscaSimpleProfile.RelationshipTypes.Should().NotBeNull(); toscaSimpleProfile.RelationshipTypes.Should().HaveCount(0); }
protected override void ProcessRecord() { foreach (var path in Path) { WriteObject(ToscaServiceTemplate.Load(path)); } }
public void Ctor_Imports_Initialized_To_Empty() { var toscaSimpleProfile = new ToscaServiceTemplate(); toscaSimpleProfile.Imports.Should().NotBeNull(); toscaSimpleProfile.Imports.Should().HaveCount(0); }
public void Exception_Thrown_When_Cyclic_Dependency_Between_Capability_Types_Exists() { string toscaServiceTemplate = @" tosca_definitions_version: tosca_simple_yaml_1_0 capability_types: tosca.types.SoftwareComponent: derived_from: tosca.types.BasicComponent tosca.types.BasicComponent: derived_from: tosca.types.SoftwareComponent "; var serviceTemplate = ToscaServiceTemplate.Load(toscaServiceTemplate.ToMemoryStream()); var toscaMetadata = new ToscaMetadata { CsarVersion = new Version(1, 1), EntryDefinitions = "tosca.yml", ToscaMetaFileVersion = new Version(1, 1), CreatedBy = "anonymous" }; var cloudServiceArchive = new ToscaCloudServiceArchive(toscaMetadata); cloudServiceArchive.AddToscaServiceTemplate("tosca.yml", serviceTemplate); List <ValidationResult> results; cloudServiceArchive.TryValidate(out results).Should().BeFalse(); results.Should().ContainSingle(r => r.ErrorMessage.Equals("Circular dependency detected on CapabilityType: 'tosca.types.BasicComponent'")); results.Should().ContainSingle(r => r.ErrorMessage.Equals("Circular dependency detected on CapabilityType: 'tosca.types.SoftwareComponent'")); }
public void Service_Template_Can_Be_Serialized_And_Deserialized() { byte[] bytes; using (var readingStream = new MemoryStream()) { var serviceTemplateSerializer = new ToscaSerializer <ToscaServiceTemplate>(new TypeConvertersFactory()); var serviceTemplate = new ToscaServiceTemplate(); serviceTemplate.ToscaDefinitionsVersion = "tosca_simple_yaml_1_0"; serviceTemplate.NodeTypes.Add("node", new ToscaNodeType { Version = new Version(1, 2, 3, 4) }); serviceTemplateSerializer.Serialize(readingStream, serviceTemplate); bytes = readingStream.GetBuffer(); } var serviceTemplateDeserializer = ToscaDeserializerTests.CreateToscaDeserializer(); using (var writingStream = new MemoryStream(bytes)) { var deserializedServiceTemplate = serviceTemplateDeserializer.Deserialize(writingStream); // Assert deserializedServiceTemplate.NodeTypes["node"].Version.Should().Be(new Version(1, 2, 3, 4)); } }
public void When_Derived_From_Node_Type_Not_Found_Proper_Error_Message_Should_Be_In_Place() { // Arrange var nxosNodeType = new ToscaNodeType { DerivedFrom = "cloudshell.nodes.Switch" }; var serviceTemplate = new ToscaServiceTemplate { ToscaDefinitionsVersion = "tosca_simple_yaml_1_0" }; serviceTemplate.NodeTypes.Add("vendor.switch.NXOS", nxosNodeType); var cloudServiceArchive = new ToscaCloudServiceArchive(new ToscaMetadata { CreatedBy = "Anonymous", CsarVersion = new Version(1, 1), EntryDefinitions = "tosca.yaml", ToscaMetaFileVersion = new Version(1, 1) }); cloudServiceArchive.AddToscaServiceTemplate("tosca.yaml", serviceTemplate); // Act var validationResults = new List <ValidationResult>(); Action action = () => cloudServiceArchive.TryValidate(out validationResults); // Assert action.ShouldThrow <ToscaNodeTypeNotFoundException>() .WithMessage("Node type 'cloudshell.nodes.Switch' not found"); }
public void Metadata_Initialized_To_Empty_Dictionary() { var toscaSimpleProfile = new ToscaServiceTemplate(); toscaSimpleProfile.Metadata.Should().NotBeNull(); toscaSimpleProfile.Metadata.Should().HaveCount(0); }
public void Ctor_CapabilityTypes_Initialized_To_Empty() { var toscaSimpleProfile = new ToscaServiceTemplate(); toscaSimpleProfile.CapabilityTypes.Should().NotBeNull(); toscaSimpleProfile.CapabilityTypes.Should().HaveCount(0); }
public void Validate_Tosca_Files_In_Local_Directory(FileContent fileContent) { using (var memoryStream = fileContent.Content.ToMemoryStream()) { ToscaServiceTemplate.Load(memoryStream); } }
public void IsDerivedFrom_Returns_True_When_Derived_From_Another_Capability_Type() { // Arrange var derivedCapabilityType = new ToscaCapabilityType { DerivedFrom = "base" }; var baseCapabilityType = new ToscaCapabilityType(); var serviceTemplate = new ToscaServiceTemplate() { ToscaDefinitionsVersion = "tosca_simple_yaml_1_0" }; serviceTemplate.CapabilityTypes.Add("base", baseCapabilityType); serviceTemplate.CapabilityTypes.Add("derived", derivedCapabilityType); var cloudServiceArchive = new ToscaCloudServiceArchive(new ToscaMetadata { CreatedBy = "Anonymous", CsarVersion = new Version(1, 1), EntryDefinitions = "tosca.yaml", ToscaMetaFileVersion = new Version(1, 1) }); cloudServiceArchive.AddToscaServiceTemplate("tosca.yaml", serviceTemplate); List <ValidationResult> validationResults; cloudServiceArchive.TryValidate(out validationResults) .Should().BeTrue(string.Join(Environment.NewLine, validationResults.Select(r => r.ErrorMessage))); // Act // Assert derivedCapabilityType.IsDerivedFrom("base").Should().BeTrue(); }
public void Analyze_Imports_Multiline_Grammar() { const string toscaString = @"tosca_definitions_version: tosca_simple_yaml_1_0 description: Template for deploying a single server with predefined properties. imports: - some_definition_file: file: path1/path2/file2.yaml repository: my_service_catalog namespace_uri: http://mycompany.com/tosca/1.0/platform namespace_prefix: mycompany"; using (var memoryStream = toscaString.ToMemoryStream()) { var tosca = ToscaServiceTemplate.Load(memoryStream); // Assert tosca.ToscaDefinitionsVersion.Should().Be("tosca_simple_yaml_1_0"); tosca.Description.Should().Be("Template for deploying a single server with predefined properties."); tosca.Imports.Should().HaveCount(1); tosca.Imports.Single().Should().HaveCount(1); tosca.Imports.Single().Single().Key.Should().Be("some_definition_file"); var toscaImport = tosca.Imports.Single().Single().Value; toscaImport.File.Should().Be("path1/path2/file2.yaml"); toscaImport.Repository.Should().Be("my_service_catalog"); toscaImport.NamespaceUri.Should().Be("http://mycompany.com/tosca/1.0/platform"); toscaImport.NamespacePrefix.Should().Be("mycompany"); } }
public void Base_Property_Of_Root_NodeType_Should_Be_Null() { // Arrange var deviceNodeType = new ToscaNodeType(); deviceNodeType.Properties.Add("vendor", new ToscaProperty { Type = "string" }); var switchNodeType = new ToscaNodeType { DerivedFrom = "tosca.nodes.Device" }; switchNodeType.Properties.Add("speed", new ToscaProperty { Type = "integer" }); var serviceTemplate = new ToscaServiceTemplate { ToscaDefinitionsVersion = "tosca_simple_yaml_1_0" }; serviceTemplate.NodeTypes.Add("tosca.nodes.Switch", switchNodeType); serviceTemplate.NodeTypes.Add("tosca.nodes.Device", deviceNodeType); // Act var cloudServiceArchive = new ToscaCloudServiceArchive(new ToscaMetadata()); cloudServiceArchive.AddToscaServiceTemplate("tosca.yaml", serviceTemplate); // Assert deviceNodeType.DerivedFrom.Should().Be(ToscaDefaults.ToscaNodesRoot); deviceNodeType.GetDerivedFromEntity().Attributes.Should().ContainKey("tosca_id", "tosca.nodes.Root has tosca_id property"); }
public void Analyze_Property_Keynames_Use_Defaults() { const string toscaString = @" tosca_definitions_version: tosca_simple_yaml_1_0 node_types: example.TransactionSubsystem: properties: num_cpus: type: integer"; using (var memoryStream = toscaString.ToMemoryStream()) { var tosca = ToscaServiceTemplate.Load(memoryStream); // Assert var numCpusProperty = tosca.NodeTypes["example.TransactionSubsystem"].Properties["num_cpus"]; numCpusProperty.Type.Should().Be("integer"); numCpusProperty.Description.Should().BeNull(); numCpusProperty.Default.Should().BeNull(); numCpusProperty.Required.Should().BeTrue(); numCpusProperty.Status.Should().Be(ToscaPropertyStatus.supported); numCpusProperty.EntrySchema.Should().BeNull(); numCpusProperty.Constraints.Should().BeEmpty(); } }
public void Property_Default_Are_Loaded_When_Not_Specified() { const string toscaString = @" tosca_definitions_version: tosca_simple_yaml_1_0 node_types: example.TransactionSubsystem: properties: num_cpus: type: integer "; var serviceTemplate = ToscaServiceTemplate.Load(toscaString.ToMemoryStream()); // Assert var numCpusProperty = serviceTemplate.NodeTypes["example.TransactionSubsystem"].Properties["num_cpus"]; numCpusProperty.Type.Should().Be("integer"); numCpusProperty.Description.Should().BeNull(); numCpusProperty.Default.Should().BeNull(); numCpusProperty.Required.Should().BeTrue(); numCpusProperty.Status.Should().Be(ToscaPropertyStatus.supported); numCpusProperty.EntrySchema.Should().BeNull(); numCpusProperty.Constraints.Should().BeEmpty(); }
public void Validate_Tosca_Files_In_Github_Repository_Of_Quali(FileContent fileContent) { string toscaAsString = fileContent.Content; using (var memoryStream = toscaAsString.ToMemoryStream()) { ToscaServiceTemplate.Load(memoryStream); } }
public void GetAllProperties_Overrides_Properties_Of_Base_Node_Types() { // Arrange var switchNodeType = new ToscaNodeType(); switchNodeType.Properties.Add("speed", new ToscaProperty { Type = "string", Default = "10MBps", Required = true, Description = "switch description", Tags = new List <string>(new [] { "read_only" }) }); var nxosNodeType = new ToscaNodeType { DerivedFrom = "cloudshell.nodes.Switch" }; nxosNodeType.Properties.Add("speed", new ToscaProperty { Type = "string", Default = "1GBps", Required = false, Description = "nxos description", Tags = new List <string>(new[] { "admin_only" }) }); var serviceTemplate = new ToscaServiceTemplate { ToscaDefinitionsVersion = "tosca_simple_yaml_1_0" }; serviceTemplate.NodeTypes.Add("cloudshell.nodes.Switch", switchNodeType); serviceTemplate.NodeTypes.Add("vendor.switch.NXOS", nxosNodeType); var cloudServiceArchive = new ToscaCloudServiceArchive(new ToscaMetadata { CreatedBy = "Anonymous", CsarVersion = new Version(1, 1), EntryDefinitions = "tosca.yaml", ToscaMetaFileVersion = new Version(1, 1) }); cloudServiceArchive.AddToscaServiceTemplate("tosca.yaml", serviceTemplate); var validationResults = new List <ValidationResult>(); cloudServiceArchive.TryValidate(out validationResults).Should() .BeTrue(string.Join(Environment.NewLine, validationResults.Select(r => r.ErrorMessage))); // Act var allProperties = nxosNodeType.GetAllProperties(); // Assert allProperties["speed"].Default.Should().Be("1GBps"); allProperties["speed"].Required.Should().BeFalse(); allProperties["speed"].Description.Should().Be("nxos description"); allProperties["speed"].Tags.ShouldAllBeEquivalentTo(new [] { "admin_only" }); }
public void Load_Service_Template_From_Stream_And_Save_Succeeds() { const string toscaString = @" tosca_definitions_version: tosca_simple_yaml_1_0 node_types: example.TransactionSubsystem: properties: num_cpus: type: integer description: Number of CPUs requested for a software node instance. default: 1 status: experimental required: true entry_schema: default constraints: - valid_values: [ 1, 2, 4, 8 ]"; var serviceTemplate = ToscaServiceTemplate.Load(toscaString.ToMemoryStream()); byte[] savedTemplateBuffer; using (var memoryStream = new MemoryStream()) { serviceTemplate.Save(memoryStream); memoryStream.Flush(); savedTemplateBuffer = memoryStream.GetBuffer(); } var loadedAfterSaveTemplate = ToscaServiceTemplate.Load(new MemoryStream(savedTemplateBuffer)); // Assert loadedAfterSaveTemplate.ToscaDefinitionsVersion.Should().Be("tosca_simple_yaml_1_0"); loadedAfterSaveTemplate.Description.Should().BeNull(); loadedAfterSaveTemplate.NodeTypes.Should().HaveCount(1); var nodeType = serviceTemplate.NodeTypes["example.TransactionSubsystem"]; nodeType.Properties.Should().HaveCount(1); var numCpusProperty = nodeType.Properties["num_cpus"]; numCpusProperty.Type.Should().Be("integer"); numCpusProperty.Description.Should().Be("Number of CPUs requested for a software node instance."); numCpusProperty.Default.Should().Be("1"); numCpusProperty.Required.Should().BeTrue(); numCpusProperty.Status.Should().Be(ToscaPropertyStatus.experimental); numCpusProperty.EntrySchema.Type.Should().Be("default"); numCpusProperty.Constraints.Should().HaveCount(1); numCpusProperty.Constraints.Single().Should().HaveCount(1); var validValues = (List <object>)numCpusProperty.Constraints.Single()["valid_values"]; validValues.Should().BeEquivalentTo(new List <object> { "1", "2", "4", "8" }); }
public void Analyze_Overriding_Behavior_of_Predefined_Node_Types() { const string toscaString = @"tosca_definitions_version: tosca_simple_yaml_1_0 description: Template for deploying a single server with MySQL software on top. topology_template: inputs: # omitted here for brevity node_templates: mysql: type: tosca.nodes.DBMS.MySQL properties: root_password: { get_input: my_mysql_rootpw } port: { get_input: my_mysql_port } requirements: - host: db_server interfaces: Standard: configure: scripts/my_own_configure.sh db_server: type: tosca.nodes.Compute capabilities: # omitted here for brevity"; using (var memoryStream = toscaString.ToMemoryStream()) { var tosca = ToscaServiceTemplate.Load(memoryStream); // Assert tosca.ToscaDefinitionsVersion.Should().Be("tosca_simple_yaml_1_0"); tosca.Description.Should().Be("Template for deploying a single server with MySQL software on top."); var topologyTemplate = tosca.TopologyTemplate; topologyTemplate.Inputs.Should().BeNull(); topologyTemplate.Outputs.Should().BeEmpty(); topologyTemplate.NodeTemplates.Should().HaveCount(2); var mysqlNodeTemplate = topologyTemplate.NodeTemplates["mysql"]; mysqlNodeTemplate.Type.Should().Be("tosca.nodes.DBMS.MySQL"); var requirementKeyValue = mysqlNodeTemplate.Requirements.Single().Single(); requirementKeyValue.Key.Should().Be("host"); requirementKeyValue.Value.Node.Should().Be("db_server"); var standardInterface = (IDictionary <object, object>)mysqlNodeTemplate.Interfaces["Standard"]; standardInterface["configure"].Should().Be("scripts/my_own_configure.sh"); var dbServerNodeTemplate = topologyTemplate.NodeTemplates["db_server"]; dbServerNodeTemplate.Type.Should().Be("tosca.nodes.Compute"); dbServerNodeTemplate.Capabilities.Should().BeNull(); dbServerNodeTemplate.Requirements.Should().BeEmpty(); } }
public void GetAllProperties_Description_Should_Not_Be_Overriden_When_Another_Capability_Type_Overrides_It() { // Arrange var simpleCapabilityType = new ToscaCapabilityType { DerivedFrom = "base" }; simpleCapabilityType.Properties.Add("list", new ToscaProperty() { Type = "list", Default = new object[] {} }); var derivedCapabilityType = new ToscaCapabilityType { DerivedFrom = "base" }; derivedCapabilityType.Properties.Add("description", new ToscaProperty { Type = "string", Default = "derived description" }); var baseCapabilityType = new ToscaCapabilityType(); baseCapabilityType.Properties.Add("description", new ToscaProperty { Type = "string", Default = "base description" }); var serviceTemplate = new ToscaServiceTemplate { ToscaDefinitionsVersion = "tosca_simple_yaml_1_0" }; serviceTemplate.CapabilityTypes.Add("base", baseCapabilityType); serviceTemplate.CapabilityTypes.Add("derived", derivedCapabilityType); serviceTemplate.CapabilityTypes.Add("simple", simpleCapabilityType); var cloudServiceArchive = new ToscaCloudServiceArchive(new ToscaMetadata { CreatedBy = "Anonymous", CsarVersion = new Version(1, 1), EntryDefinitions = "tosca.yaml", ToscaMetaFileVersion = new Version(1, 1) }); cloudServiceArchive.AddToscaServiceTemplate("tosca.yaml", serviceTemplate); List <ValidationResult> validationResults; cloudServiceArchive.TryValidate(out validationResults) .Should().BeTrue(string.Join(Environment.NewLine, validationResults.Select(r => r.ErrorMessage))); // Act var descriptionProperty = derivedCapabilityType.GetAllProperties()["description"]; descriptionProperty = simpleCapabilityType.GetAllProperties()["description"]; // Assert descriptionProperty.Default.Should().Be("base description"); }
public void GetAllProperties_Constraints_Are_Merged_From_Base_And_Derived_Node_Type() { // Arrange var serviceTemplate = ToscaServiceTemplate.Load(@" tosca_definitions_version: tosca_simple_yaml_1_0 metadata: template_author: Anonymous template_name: TOSCA template_version: 1.1 node_types: cloudshell.nodes.Switch: properties: speed: type: string required: true default: 10MBps constraints: - valid_values: [10MBps, 100MBps, 1GBps] vendor.switch.NXOS: derived_from: cloudshell.nodes.Switch properties: speed: type: string default: 1mps constraints: - max_length: 128 ".ToMemoryStream()); var cloudServiceArchive = new ToscaCloudServiceArchive(new ToscaMetadata { CreatedBy = "Anonymous", CsarVersion = new Version(1, 1), EntryDefinitions = "tosca.yaml", ToscaMetaFileVersion = new Version(1, 1) }); cloudServiceArchive.AddToscaServiceTemplate("tosca.yaml", serviceTemplate); var validationResults = new List <ValidationResult>(); cloudServiceArchive.TryValidate(out validationResults).Should() .BeTrue(string.Join(Environment.NewLine, validationResults.Select(r => r.ErrorMessage))); // Act var allProperties = serviceTemplate.NodeTypes["vendor.switch.NXOS"].GetAllProperties(); // Assert allProperties["speed"].Default.Should().Be("1mps"); var validValues = allProperties["speed"].GetConstraintsDictionary()["valid_values"]; ((List <object>)validValues).ShouldBeEquivalentTo(new[] { "10MBps", "100MBps", "1GBps" }); var maxLength = allProperties["speed"].GetConstraintsDictionary()["max_length"]; maxLength.Should().Be("128"); }
public void Validation_Valid_Values_Of_Custom_Data_Type_Should_Pass_If_Proper_Parser_Registered() { // Arrange var toscaMetadata = new ToscaMetadata { CreatedBy = "Anonymous", CsarVersion = new Version(1, 1, 2), EntryDefinitions = "definitions.yaml", ToscaMetaFileVersion = new Version(1, 0) }; var cloudServiceArchive = new ToscaCloudServiceArchive(toscaMetadata); var definitions = new ToscaServiceTemplate { ToscaDefinitionsVersion = "tosca_simple_yaml_1_0" }; var complexDataType = new ToscaDataType(); var realProperty = new ToscaProperty { Type = "float" }; complexDataType.Properties.Add("real", realProperty); complexDataType.Properties.Add("imaginary", new ToscaProperty { Type = "float" }); definitions.DataTypes.Add("tosca.standard.Complex", complexDataType); var complexProperty = new ToscaProperty { Type = "tosca.standard.Complex" }; complexProperty.Constraints.Add(new Dictionary <string, object> { { "valid_values", new List <object> { "1 + 1i" } } }); var basicNodetype = new ToscaNodeType(); basicNodetype.Properties.Add("complex", complexProperty); definitions.NodeTypes.Add("basic", basicNodetype); DependencyResolver.Current.RegisterDataTypeConverter(new CustomDataTypeConverter()); cloudServiceArchive.AddToscaServiceTemplate("definitions.yaml", definitions); // Act List <ValidationResult> results; cloudServiceArchive.TryValidate(out results); // Assert results.Should().BeEmpty(); }
public void Exception_Should_Be_Thrown_When_Parser_For_Custom_Data_Type_Not_Defined() { // Arrange var toscaMetadata = new ToscaMetadata { CreatedBy = "Anonymous", CsarVersion = new Version(1, 1, 2), EntryDefinitions = "definitions.yaml", ToscaMetaFileVersion = new Version(1, 0) }; var cloudServiceArchive = new ToscaCloudServiceArchive(toscaMetadata); var definitions = new ToscaServiceTemplate { ToscaDefinitionsVersion = "tosca_simple_yaml_1_0" }; var complexDataType = new ToscaDataType(); var realProperty = new ToscaProperty { Type = "float" }; complexDataType.Properties.Add("real", realProperty); complexDataType.Properties.Add("imaginary", new ToscaProperty { Type = "float" }); definitions.DataTypes.Add("tosca.standard.Complex", complexDataType); var complexProperty = new ToscaProperty { Type = "tosca.standard.Complex" }; complexProperty.Constraints.Add(new Dictionary <string, object> { { "valid_values", new List <object> { "1 + 1i" } } }); var basicNodetype = new ToscaNodeType(); basicNodetype.Properties.Add("complex", complexProperty); definitions.NodeTypes.Add("basic", basicNodetype); cloudServiceArchive.AddToscaServiceTemplate("definitions.yaml", definitions); // Act List <ValidationResult> results; Action action = () => cloudServiceArchive.TryValidate(out results); // Assert action.ShouldThrow <ToscaDataTypeParserNotFoundException>() .WithMessage("Parser for data type 'tosca.standard.Complex' nod found."); }
public void GetAllProperties_Override_Base_Properties() { // Arrange var derivedCapabilityType = new ToscaCapabilityType { DerivedFrom = "base" }; derivedCapabilityType.Properties.Add("speed", new ToscaProperty { Type = "string", Required = false, Default = "10MBps", Description = "derived description" }); var baseCapabilityType = new ToscaCapabilityType(); baseCapabilityType.Properties.Add("speed", new ToscaProperty { Type = "string", Required = true, Default = "", Description = "base description" }); var serviceTemplate = new ToscaServiceTemplate { ToscaDefinitionsVersion = "tosca_simple_yaml_1_0" }; serviceTemplate.CapabilityTypes.Add("base", baseCapabilityType); serviceTemplate.CapabilityTypes.Add("derived", derivedCapabilityType); var cloudServiceArchive = new ToscaCloudServiceArchive(new ToscaMetadata { CreatedBy = "Anonymous", CsarVersion = new Version(1, 1), EntryDefinitions = "tosca.yaml", ToscaMetaFileVersion = new Version(1, 1) }); cloudServiceArchive.AddToscaServiceTemplate("tosca.yaml", serviceTemplate); List <ValidationResult> validationResults; cloudServiceArchive.TryValidate(out validationResults) .Should().BeTrue(string.Join(Environment.NewLine, validationResults.Select(r => r.ErrorMessage))); // Act // Assert var speedProperty = derivedCapabilityType.GetAllProperties()["speed"]; speedProperty.Type.Should().Be("string"); speedProperty.Required.Should().BeFalse(); speedProperty.Default.Should().Be("10MBps"); speedProperty.Description.Should().Be("derived description"); }
public void ToscaParsingException_Should_Be_Thrown_When_Wrong_Tosca_Parsed() { Action action = () => { using (var memoryStream = "unsupported_something:".ToMemoryStream()) { ToscaServiceTemplate.Load(memoryStream); } }; action.ShouldThrow <ToscaParsingException>() .WithMessage(@"(Line: 1, Col: 1, Idx: 0) - (Line: 1, Col: 1, Idx: 0): Exception during deserialization Property 'unsupported_something' not found on type 'Toscana.ToscaServiceTemplate'."); }
public void Analyze_HelloWorld_AllDataAnalyzed() { const string toscaString = @" tosca_definitions_version: tosca_simple_yaml_1_0 description: Template for deploying a single server with predefined properties. topology_template: node_templates: my_server: type: tosca.nodes.Compute capabilities: # Host container properties host: properties: num_cpus: 1 disk_size: 10 GB mem_size: 4096 MB # Guest Operating System properties os: properties: # host Operating System image properties architecture: x86_64 type: linux distribution: rhel version: 6.5 "; using (var memoryStream = toscaString.ToMemoryStream()) { var tosca = ToscaServiceTemplate.Load(memoryStream); // Assert tosca.ToscaDefinitionsVersion.Should().Be("tosca_simple_yaml_1_0"); tosca.Description.Should().Be("Template for deploying a single server with predefined properties."); var nodeTemplate = tosca.TopologyTemplate.NodeTemplates["my_server"]; nodeTemplate.Type.Should().Be("tosca.nodes.Compute"); var host = nodeTemplate.Capabilities["host"]; host.Properties["num_cpus"].Should().Be("1"); host.Properties["disk_size"].Should().Be("10 GB"); host.Properties["mem_size"].Should().Be("4096 MB"); var os = nodeTemplate.Capabilities["os"]; os.Properties["architecture"].Should().Be("x86_64"); os.Properties["type"].Should().Be("linux"); os.Properties["distribution"].Should().Be("rhel"); os.Properties["version"].Should().Be("6.5"); } }
public void Analyze_Template_For_a_Simple_Software_Installation() { const string toscaString = @"tosca_definitions_version: tosca_simple_yaml_1_0 description: Template for deploying a single server with MySQL software on top. topology_template: inputs: # omitted here for brevity node_templates: mysql: type: tosca.nodes.DBMS.MySQL properties: root_password: { get_input: my_mysql_rootpw } port: { get_input: my_mysql_port } requirements: - host: db_server db_server: type: tosca.nodes.Compute capabilities: # omitted here for brevity"; using (var memoryStream = toscaString.ToMemoryStream()) { var tosca = ToscaServiceTemplate.Load(memoryStream); // Assert tosca.ToscaDefinitionsVersion.Should().Be("tosca_simple_yaml_1_0"); tosca.Description.Should().Be("Template for deploying a single server with MySQL software on top."); var topologyTemplate = tosca.TopologyTemplate; topologyTemplate.Inputs.Should().BeNull(); topologyTemplate.Outputs.Should().BeEmpty(); topologyTemplate.NodeTemplates.Should().HaveCount(2); var mysqlNodeTemplate = topologyTemplate.NodeTemplates["mysql"]; mysqlNodeTemplate.Type.Should().Be("tosca.nodes.DBMS.MySQL"); var requirementKeyValue = mysqlNodeTemplate.Requirements.Single().Single(); requirementKeyValue.Key.Should().Be("host"); requirementKeyValue.Value.Node.Should().Be("db_server"); var dbServerNodeTemplate = topologyTemplate.NodeTemplates["db_server"]; dbServerNodeTemplate.Type.Should().Be("tosca.nodes.Compute"); dbServerNodeTemplate.Capabilities.Should().BeNull(); dbServerNodeTemplate.Requirements.Should().BeEmpty(); } }