Пример #1
0
        public async Task LoadExistingApps()
        {
            await _lock.WaitAsync();

            try
            {
                var jsonBody = await GetContainerGroups();

                JArray valueArray  = jsonBody.value;
                var    publicPorts = new HashSet <uint>();
                foreach (dynamic value in valueArray)
                {
                    string containerGroupName = value.name;
                    string appName            = ACIUtils.GetAppNameFromContainerGroupName(containerGroupName);
                    var    properties         = value.properties;
                    var    ipAddress          = properties.ipAddress;
                    string ip = ipAddress.ip;
                    if (ip == null)
                    {
                        continue;
                    }
                    var containerGroup = new ContainerGroup(containerGroupName, _config.Region, ip);
                    foreach (var port in ipAddress.ports)
                    {
                        uint portNo = port.port;
                        publicPorts.Add(portNo);
                    }
                    var containers = properties.containers;
                    foreach (var container in containers)
                    {
                        string containerName       = container.name;
                        var    containerProperties = container.properties;
                        string containerImage      = containerProperties.image;
                        var    currentContainer    = new Container(containerName, containerImage);
                        var    containerPorts      = containerProperties.ports;
                        foreach (var containerPort in containerPorts)
                        {
                            uint portNo = containerPort.port;
                            var  cPort  = new ContainerPort(portNo, publicPorts.Contains(portNo));
                            currentContainer.AddPort(cPort);
                        }
                        containerGroup.AddContainer(currentContainer);
                    }
                    ContainerGroupCollection containerGroupCollection;
                    if (!_containerGroupCollections.TryGetValue(appName, out containerGroupCollection))
                    {
                        containerGroupCollection = new ContainerGroupCollection(appName);
                    }
                    containerGroupCollection.AddContainerGroup(containerGroup);
                    _containerGroupCollections[appName] = containerGroupCollection;
                    publicPorts.Clear();
                }
            }
            finally
            {
                _lock.Release();
            }
        }
Пример #2
0
        public async Task CreateApp(string appName, dynamic appDefinition)
        {
            await _lock.WaitAsync();

            try
            {
                if (_containerGroupCollections.ContainsKey(appName))
                {
                    throw new Exception($"{appName} exists already");
                }

                var containerGroupDefinition = appDefinition.containerGroup;
                var containerDefinitions     = containerGroupDefinition.containers;

                var containerGroupName = ACIUtils.GetContainerGroupNameForAppName(appName);
                var containerGroup     = new ContainerGroup(containerGroupName, _config.Region, "");
                foreach (var containerDefinition in containerDefinitions)
                {
                    string containerName            = containerDefinition.name;
                    string image                    = containerDefinition.image;
                    var    container                = new Container(containerName, image);
                    var    containerPortsDefinition = containerDefinition.ports;

                    foreach (var containerPortDefinition in containerPortsDefinition)
                    {
                        uint   port          = containerPortDefinition.port;
                        string typeString    = containerPortDefinition.type;
                        var    isPublic      = typeString.Equals("public", StringComparison.OrdinalIgnoreCase);
                        var    containerPort = new ContainerPort(port, isPublic);
                        container.AddPort(containerPort);
                    }
                    containerGroup.AddContainer(container);
                }

                containerGroup.IpAddress = await CreateContainerGroup(containerGroup);

                var containerGroupCollection = new ContainerGroupCollection(appName);
                containerGroupCollection.AddContainerGroup(containerGroup);
                _containerGroupCollections[appName] = containerGroupCollection;
                await Task.Delay(ContainerGroupCreationMillisecondsDelay);
            }
            finally
            {
                _lock.Release();
            }
        }
Пример #3
0
        public override int GetHashCode()
        {
            int hash = 1;

            if (ContainerPort != 0)
            {
                hash ^= ContainerPort.GetHashCode();
            }
            if (PublicPort != 0)
            {
                hash ^= PublicPort.GetHashCode();
            }
            if (Kind != 0)
            {
                hash ^= Kind.GetHashCode();
            }
            return(hash);
        }
Пример #4
0
        public ContainerPort ReservePort(ushort suggestedPort)
        {
            rwlock.EnterUpgradeableReadLock();
            try
            {
                if (port == null)
                {
                    rwlock.EnterWriteLock();
                    try
                    {
                        port = new ContainerPort(suggestedPort, this.user);
                    }
                    finally
                    {
                        rwlock.ExitWriteLock();
                    }
                }
                else
                {
                    log.Trace("Container '{0}' already assigned port '{1}'", handle, port);
                }
            }
            finally
            {
                rwlock.ExitUpgradeableReadLock();
            }

            return port;
        }
Пример #5
0
        private static void UpdateSubContainers(DesignPrimitivesWrapper de,
                                                Container rootContainerType,
                                                DesignModel rootDesignModel,
                                                Dictionary <CyPhy.Port, PortInstance> cyphyPorts2PortInstances,
                                                Dictionary <CyPhy.Port, ContainerPort> containerPorts,
                                                List <Connection> connectionsToBeVisited,
                                                Dictionary <CyPhy.SimpleFormula, ContainerCalculation> simpleFormulas,
                                                Dictionary <CyPhy.ValueFlowTarget, AVM.META.Design.ValueType> valueInstances,
                                                Dictionary <CyPhy.Port, StructuralInterfaceInstance> innerStructuralPortInstances,
                                                Dictionary <CyPhy.Port, ContainerStructuralInterface> containerStructuralPortInstances)
        {
            System.Diagnostics.Debug.WriteLine(de.Path);

            // Init list
            if (rootContainerType.ContainerPorts == null)
            {
                rootContainerType.ContainerPorts = new List <ContainerPort>();
            }
            rootContainerType.ComponentInstances = new List <ComponentInstance>();

            // Add Powerflows, JointStrucutres and ValueFlows for later steps
            connectionsToBeVisited.AddRange(de.ValueFlows);


            #region Handle ComponentRefs
            var componentRefs = de.ComponentRefs;
            foreach (var compRef in componentRefs)
            {
                var isComponent = false;
                try
                {
                    var c = compRef.Referred.Component;
                    // line above throws an exception if it is not a component
                    isComponent = true;
                }
                catch
                {
                }

                if (compRef != null && isComponent)
                {
                    CyPhy.Component comp = compRef.Referred.Component;
                    System.Diagnostics.Debug.WriteLine(comp.Path);

                    ComponentInstance compInst = Component2ComponentInstance(comp);
                    rootContainerType.ComponentInstances.AddItem(compInst);
                    compInst.Name = compRef.Name;
                    //compInst.id = GetOrSetID(compRef);
                    //compInst.id = compRef.Guid.ToString();

                    String instanceGUID = compRef.Attributes.InstanceGUID;
                    // Set this value if not set
                    if (String.IsNullOrWhiteSpace(instanceGUID))
                    {
                        compRef.Attributes.InstanceGUID = compRef.Guid.ToString();
                        instanceGUID = compRef.Attributes.InstanceGUID;
                    }
                    compInst.id = compRef.Attributes.InstanceGUID;


                    String s_SrcDesignSpaceContainerID = GetDesignSpaceSourceObjectID(compRef);
                    if (!String.IsNullOrWhiteSpace(s_SrcDesignSpaceContainerID))
                    {
                        compInst.SrcDesignSpaceContainerID = s_SrcDesignSpaceContainerID;
                    }

                    // Update Component's PortInstances
                    compInst.PortInstances = new List <PortInstance>();
                    foreach (CyPhy.Port port in comp.Children.PortCollection)
                    {
#if TRACK_PORT_ID
                        var portInst = new PortInstance {
                            IDinSourceModel = port.ID
                        };
#else
                        var portInst = new PortInstance {
                            IDinSourceModel = port.Attributes.ID
                        };
#endif
                        //var portInst = new PortInstance { IDinSourceModel = port.ID };
                        compInst.PortInstances.AddItem(portInst);

                        if (!cyphyPorts2PortInstances.ContainsKey(port))
                        {
                            cyphyPorts2PortInstances.Add(port, portInst); // Update Ports list
                        }
                    }

                    // Convert parameters
                    foreach (var p in comp.Children.ParameterCollection)
                    {
                        double result = 0;
                        double.TryParse(p.Attributes.Value, out result);
                        var componentNamedValueInstance = new ComponentNamedValueInstance {
                            IDinComponentModel = p.Attributes.ID, Value = result
                        };
                        compInst.NamedValueInstances.AddItem(componentNamedValueInstance);
                        if (valueInstances.ContainsKey(p))
                        {
                            continue;
                        }

                        valueInstances.Add(p, componentNamedValueInstance);
                    }

                    // Convert properties
                    foreach (var p in comp.Children.PropertyCollection)
                    {
                        double result = 0;
                        double.TryParse(p.Attributes.Value, out result);
                        var componentNamedValueInstance = new ComponentNamedValueInstance {
                            IDinComponentModel = p.Attributes.ID, Value = result
                        };
                        compInst.NamedValueInstances.AddItem(componentNamedValueInstance);
                        if (valueInstances.ContainsKey(p))
                        {
                            continue;
                        }

                        valueInstances.Add(p, componentNamedValueInstance);
                    }
                }
            }
            #endregion

            #region Handle Component instances
            List <CyPhy.Component> lcChildComps = de.Components;

            foreach (CyPhy.Component comp in lcChildComps)
            {
                System.Diagnostics.Debug.WriteLine(comp.Path);

                ComponentInstance compInst = Component2ComponentInstance(comp);
                rootContainerType.ComponentInstances.AddItem(compInst);

                // Update Component's PortInstances
                compInst.PortInstances = new List <PortInstance>();
                foreach (CyPhy.Port port in comp.Children.PortCollection)
                {
#if TRACK_PORT_ID
                    var structPort = new StructuralInterfaceInstance {
                        IDinSourceModel = port.ID
                    };
#else
                    var structPort = new StructuralInterfaceInstance {
                        IDinSourceModel = port.Attributes.ID
                    };
#endif
                    if (!innerStructuralPortInstances.ContainsKey(port))
                    {
                        innerStructuralPortInstances.Add(port, structPort);
                        compInst.StructuralInterfaceInstances.Add(structPort);
                    }

#if TRACK_PORT_ID
                    var portInst = new PortInstance {
                        IDinSourceModel = port.ID
                    };
#else
                    var portInst = new PortInstance {
                        IDinSourceModel = port.Attributes.ID
                    };
#endif
                    compInst.PortInstances.AddItem(portInst);

                    if (!cyphyPorts2PortInstances.ContainsKey(port))
                    {
                        cyphyPorts2PortInstances.Add(port, portInst); // Update Ports list
                    }
                }

                // Convert parameters
                foreach (var p in comp.Children.ParameterCollection)
                {
                    double result = 0;
                    double.TryParse(p.Attributes.Value, out result);
                    var componentNamedValueInstance = new ComponentNamedValueInstance {
                        IDinComponentModel = p.Attributes.ID, Value = result
                    };
                    compInst.NamedValueInstances.AddItem(componentNamedValueInstance);
                    if (valueInstances.ContainsKey(p))
                    {
                        continue;
                    }

                    valueInstances.Add(p, componentNamedValueInstance);
                }

                // Convert properties
                foreach (var p in comp.Children.PropertyCollection)
                {
                    double result = 0;
                    double.TryParse(p.Attributes.Value, out result);
                    var componentNamedValueInstance = new ComponentNamedValueInstance {
                        IDinComponentModel = p.Attributes.ID, Value = result
                    };
                    compInst.NamedValueInstances.AddItem(componentNamedValueInstance);
                    if (valueInstances.ContainsKey(p))
                    {
                        continue;
                    }

                    valueInstances.Add(p, componentNamedValueInstance);
                }
            }
            #endregion

            // Recursively add all ContainerTypes from sub-DesignEntities
            rootContainerType.Containers = new List <Container>();
            var ldeDesignEntityChildren = de.ComponentAssemblies.Cast <CyPhy.DesignEntity>().ToList();
            ldeDesignEntityChildren.AddRange(de.DesignContainers);

            foreach (CyPhy.DesignEntity subDE in ldeDesignEntityChildren)
            {
                Container subRootContainerType;
                if (subDE is CyPhy.DesignContainer &&
                    (subDE as CyPhy.DesignContainer).Attributes.ContainerType == CyPhyClasses.DesignContainer.AttributesClass.ContainerType_enum.Compound)
                {
                    subRootContainerType = new Compound();
                }
                else if (subDE is CyPhy.DesignContainer &&
                         (subDE as CyPhy.DesignContainer).Attributes.ContainerType == CyPhyClasses.DesignContainer.AttributesClass.ContainerType_enum.Alternative)
                {
                    subRootContainerType = new Alternative();
                }
                else if (subDE is CyPhy.DesignContainer &&
                         (subDE as CyPhy.DesignContainer).Attributes.ContainerType == CyPhyClasses.DesignContainer.AttributesClass.ContainerType_enum.Optional)
                {
                    subRootContainerType = new Optional();
                }
                else if (subDE is CyPhy.ComponentAssembly)
                {
                    subRootContainerType = new Compound();
                }
                else
                {
                    continue;
                }

                subRootContainerType.Name = subDE.Name;
                subRootContainerType.id   = GetOrSetID(subDE);

                rootContainerType.Containers.AddItem(subRootContainerType);

                UpdateSubContainers(new DesignPrimitivesWrapper(subDE), subRootContainerType, rootDesignModel, cyphyPorts2PortInstances, containerPorts, connectionsToBeVisited, simpleFormulas, valueInstances, innerStructuralPortInstances, containerStructuralPortInstances);
            }

            #region Elements on the current container

            // Convert simple formulas
            foreach (var sf in de.SimpleFormulas)
            {
                var containerCalculation = new ContainerCalculation();
                rootContainerType.ContainerValues.AddItem(containerCalculation);
                simpleFormulas[sf] = containerCalculation;
            }

            // Add container ports (from ports)
            foreach (var port in de.Ports)
            {
                if (containerPorts.ContainsKey(port))
                {
                    continue;
                }

                var pi = new ContainerPort();
                containerPorts.Add(port, pi);
                rootContainerType.ContainerPorts.AddItem(pi);
            }

            // Convert parameters
            foreach (var p in de.Parameters)
            {
                var containerNamedValue = new ContainerNamedValue {
                    IsParameter = true, Value = p.Attributes.Value
                };
                rootContainerType.ContainerValues.AddItem(containerNamedValue);
                if (valueInstances.ContainsKey(p))
                {
                    continue;
                }

                valueInstances.Add(p, containerNamedValue);
            }

            // Convert properties
            foreach (var p in de.Properties)
            {
                var containerNamedValue = new ContainerNamedValue {
                    IsParameter = false, Value = p.Attributes.Value
                };
                rootContainerType.ContainerValues.AddItem(containerNamedValue);
                if (valueInstances.ContainsKey(p))
                {
                    continue;
                }

                valueInstances.Add(p, containerNamedValue);
            }

            #endregion
        }