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");
        }
示例#5
0
        public void RelationshipTypes_Initialized_To_Empty_Dictionary()
        {
            var toscaSimpleProfile = new ToscaServiceTemplate();

            toscaSimpleProfile.RelationshipTypes.Should().NotBeNull();
            toscaSimpleProfile.RelationshipTypes.Should().HaveCount(0);
        }
示例#6
0
 protected override void ProcessRecord()
 {
     foreach (var path in Path)
     {
         WriteObject(ToscaServiceTemplate.Load(path));
     }
 }
示例#7
0
        public void Ctor_Imports_Initialized_To_Empty()
        {
            var toscaSimpleProfile = new ToscaServiceTemplate();

            toscaSimpleProfile.Imports.Should().NotBeNull();
            toscaSimpleProfile.Imports.Should().HaveCount(0);
        }
示例#8
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));
            }
        }
示例#10
0
        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");
        }
示例#11
0
        public void Metadata_Initialized_To_Empty_Dictionary()
        {
            var toscaSimpleProfile = new ToscaServiceTemplate();

            toscaSimpleProfile.Metadata.Should().NotBeNull();
            toscaSimpleProfile.Metadata.Should().HaveCount(0);
        }
示例#12
0
        public void Ctor_CapabilityTypes_Initialized_To_Empty()
        {
            var toscaSimpleProfile = new ToscaServiceTemplate();

            toscaSimpleProfile.CapabilityTypes.Should().NotBeNull();
            toscaSimpleProfile.CapabilityTypes.Should().HaveCount(0);
        }
示例#13
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();
        }
示例#15
0
        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");
        }
示例#17
0
        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();
            }
        }
示例#18
0
        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();
        }
示例#19
0
        public void Validate_Tosca_Files_In_Github_Repository_Of_Quali(FileContent fileContent)
        {
            string toscaAsString = fileContent.Content;

            using (var memoryStream = toscaAsString.ToMemoryStream())
            {
                ToscaServiceTemplate.Load(memoryStream);
            }
        }
示例#20
0
        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" });
        }
示例#21
0
        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"
            });
        }
示例#22
0
        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");
        }
示例#24
0
        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");
        }
示例#28
0
        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'.");
        }
示例#29
0
        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");
            }
        }
示例#30
0
        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();
            }
        }