private void ValidateServiceManifests(ApplicationTypeContext context) { IEnumerable <ServiceManifestType> serviceManifestTypes = context.GetServiceManifestTypes(); // Validates the ServiceManifest var duplicateServiceTypeDetector = new DuplicateDetector("ServiceType", "ServiceTypeName"); foreach (ServiceManifestType serviceManifestType in serviceManifestTypes) { ImageBuilder.TraceSource.WriteInfo( TraceType, "Validating ServiceManifest. ApplicationTypeName:{0}, ServiceManifestName:{1}, ServiceManifestVersion:{2}", context.ApplicationManifest.ApplicationTypeName, serviceManifestType.Name, serviceManifestType.Version); string serviceManifestFileName = context.GetServiceManifestFileName(serviceManifestType.Name); if (!ManifestValidatorUtility.IsValidName(serviceManifestType.Name)) { ImageBuilderUtility.TraceAndThrowValidationErrorWithFileName( TraceType, serviceManifestFileName, StringResources.ImageBuilderError_InvalidName_arg2, "ServiceManifest", serviceManifestType.Name, Path.DirectorySeparatorChar, StringConstants.DoubleDot); } if (!ManifestValidatorUtility.IsValidVersion(serviceManifestType.Version)) { ImageBuilderUtility.TraceAndThrowValidationErrorWithFileName( TraceType, serviceManifestFileName, StringResources.ImageBuilderError_InvalidVersion_arg2, "ServiceManifestVersion", serviceManifestType.Version, Path.DirectorySeparatorChar, StringConstants.DoubleDot); } var implicitServiceTypeCount = 0; var normalServiceTypeCount = 0; var hasServiceGroupTypes = false; foreach (object manifestServiceTypeType in serviceManifestType.ServiceTypes) { string serviceTypeName = null; string placementConstraints = null; if (manifestServiceTypeType is ServiceTypeType serviceTypeType) { serviceTypeName = serviceTypeType.ServiceTypeName; placementConstraints = serviceTypeType.PlacementConstraints; if (IsImplicitServiceType(serviceTypeType)) { ++implicitServiceTypeCount; } else { ++normalServiceTypeCount; } } else { hasServiceGroupTypes = true; ServiceGroupTypeType serviceGroupTypeType = (ServiceGroupTypeType)manifestServiceTypeType; serviceTypeName = serviceGroupTypeType.ServiceGroupTypeName; placementConstraints = serviceGroupTypeType.PlacementConstraints; } this.ValidatePlacementConstraints(serviceManifestFileName, placementConstraints); duplicateServiceTypeDetector.Add(serviceTypeName); } this.ValidateServiceTypeCombination( serviceManifestFileName, implicitServiceTypeCount, normalServiceTypeCount, hasServiceGroupTypes); var activatorCodePackageCount = 0; // Validates the CodePackage in the ServiceManifest var codePackageDuplicateDetector = new DuplicateDetector("CodePackage", "Name", serviceManifestFileName); foreach (CodePackageType codePackageType in serviceManifestType.CodePackage) { if (!ManifestValidatorUtility.IsValidName(codePackageType.Name)) { ImageBuilderUtility.TraceAndThrowValidationErrorWithFileName( TraceType, serviceManifestFileName, StringResources.ImageBuilderError_InvalidName_arg2, "CodePackage", codePackageType.Name, Path.DirectorySeparatorChar, StringConstants.DoubleDot); } if (!ManifestValidatorUtility.IsValidVersion(codePackageType.Version)) { ImageBuilderUtility.TraceAndThrowValidationErrorWithFileName( TraceType, serviceManifestFileName, StringResources.ImageBuilderError_InvalidVersion_arg2, "CodePackageVersion", codePackageType.Version, Path.DirectorySeparatorChar, StringConstants.DoubleDot); } codePackageDuplicateDetector.Add(codePackageType.Name); if (codePackageType.IsActivator) { if (implicitServiceTypeCount > 0) { ImageBuilderUtility.TraceAndThrowValidationErrorWithFileName( TraceType, serviceManifestFileName, StringResources.ImageBuilderError_GuestAppWithActivatorCodePackage); } activatorCodePackageCount++; if (activatorCodePackageCount > 1) { ImageBuilderUtility.TraceAndThrowValidationErrorWithFileName( TraceType, serviceManifestFileName, StringResources.ImageBuilderError_MultipleActivatorCodePackage); } } var codePackageFolderName = context.BuildLayoutSpecification.GetCodePackageFolder(serviceManifestType.Name, codePackageType.Name); var codePackageArchiveName = context.BuildLayoutSpecification.GetSubPackageArchiveFile(codePackageFolderName); FileLocator fileLocator = null; if (FabricFile.Exists(codePackageArchiveName)) { fileLocator = new FileLocator(codePackageArchiveName, true); } else if (FabricDirectory.Exists(codePackageFolderName)) { fileLocator = new FileLocator(codePackageFolderName, false); } else { // If the code package doesn't exist, it means it was already provisioned; // validation must have passed at the time of first provisioning continue; } if (codePackageType.SetupEntryPoint != null) { this.ValidateEntryPointPath(serviceManifestFileName, fileLocator, codePackageType.SetupEntryPoint.ExeHost.Program); } if (codePackageType.EntryPoint != null && codePackageType.EntryPoint.Item != null) { if (codePackageType.EntryPoint.Item is DllHostEntryPointType) { this.ValidateEntryPoint(serviceManifestFileName, fileLocator, (DllHostEntryPointType)codePackageType.EntryPoint.Item); } else if (codePackageType.EntryPoint.Item is ExeHostEntryPointType) { this.ValidateEntryPoint(serviceManifestFileName, fileLocator, (ExeHostEntryPointType)codePackageType.EntryPoint.Item); } } } // Validates the ConfigPackage in the ServiceManifest if (serviceManifestType.ConfigPackage != null) { DuplicateDetector configPackageDuplicateDetector = new DuplicateDetector("ConfigPackage", "Name", serviceManifestFileName); foreach (ConfigPackageType configPackageType in serviceManifestType.ConfigPackage) { if (!ManifestValidatorUtility.IsValidName(configPackageType.Name)) { ImageBuilderUtility.TraceAndThrowValidationErrorWithFileName( TraceType, serviceManifestFileName, StringResources.ImageBuilderError_InvalidName_arg2, "ConfigPackage", configPackageType.Name, Path.DirectorySeparatorChar, StringConstants.DoubleDot); } if (!ManifestValidatorUtility.IsValidVersion(configPackageType.Version)) { ImageBuilderUtility.TraceAndThrowValidationErrorWithFileName( TraceType, serviceManifestFileName, StringResources.ImageBuilderError_InvalidVersion_arg2, "ConfigPackageVersion", configPackageType.Version, Path.DirectorySeparatorChar, StringConstants.DoubleDot); } configPackageDuplicateDetector.Add(configPackageType.Name); } } // Validates the DataPackage in the ServiceManifest if (serviceManifestType.DataPackage != null) { DuplicateDetector dataPackageDuplicateDetector = new DuplicateDetector("DataPackage", "Name", serviceManifestFileName); foreach (DataPackageType dataPackageType in serviceManifestType.DataPackage) { if (!ManifestValidatorUtility.IsValidName(dataPackageType.Name)) { ImageBuilderUtility.TraceAndThrowValidationErrorWithFileName( TraceType, serviceManifestFileName, StringResources.ImageBuilderError_InvalidName_arg2, "DataPackage", dataPackageType.Name, Path.DirectorySeparatorChar, StringConstants.DoubleDot); } if (!ManifestValidatorUtility.IsValidVersion(dataPackageType.Version)) { ImageBuilderUtility.TraceAndThrowValidationErrorWithFileName( TraceType, serviceManifestFileName, StringResources.ImageBuilderError_InvalidVersion_arg2, "DataPackageVersion", dataPackageType.Version, Path.DirectorySeparatorChar, StringConstants.DoubleDot); } dataPackageDuplicateDetector.Add(dataPackageType.Name); } } // Validates the Resources in the ServiceManifest if (serviceManifestType.Resources != null && serviceManifestType.Resources.Endpoints != null) { DuplicateDetector resourceNameDuplicateDetector = new DuplicateDetector("Endpoint", "Name", serviceManifestFileName); foreach (var endpoint in serviceManifestType.Resources.Endpoints) { if (endpoint.Name.Contains(';') || endpoint.Name.Contains(',')) { ImageBuilderUtility.TraceAndThrowValidationErrorWithFileName( TraceType, serviceManifestFileName, StringResources.ImageBuilderError_InvalidName_arg2, "EndppointResource", endpoint.Name, ",", ";"); } if (!string.IsNullOrEmpty(endpoint.CodePackageRef)) { var matchingCodePackage = serviceManifestType.CodePackage.FirstOrDefault( codePackageType => ImageBuilderUtility.Equals(codePackageType.Name, endpoint.CodePackageRef)); if (matchingCodePackage == null) { ImageBuilderUtility.TraceAndThrowValidationErrorWithFileName( TraceType, serviceManifestFileName, StringResources.ImageBuilderError_InvalidRefSameFile, "CodePackageRef", endpoint.CodePackageRef, "EndppointResource", endpoint.Name, "CodePackage", "ServiceManifest"); } } resourceNameDuplicateDetector.Add(endpoint.Name); } } } }
public void Validate(ApplicationTypeContext applicationTypeContext, bool isComposeDeployment, bool isSFVolumeDiskServiceEnabled) { this.parametersAlreadyApplied = false; ValidateApplicationManifestDiagnostics(applicationTypeContext.ApplicationManifest.Diagnostics); ValidateServiceManifestDiagnostics(applicationTypeContext.GetServiceManifestTypes()); }