public override void Parse(string traceContext, YamlNode node, HashSet <string> ignoredKeys)
        {
            var rootNode = DockerComposeUtils.ValidateAndGetMapping(traceContext, "", node);

            foreach (var item in rootNode.Children)
            {
                switch (item.Key.ToString())
                {
                case DockerComposeConstants.ExternalNetworkDriver:
                {
                    ParseExternalNetworkNode(
                        DockerComposeUtils.GenerateTraceContext(traceContext,
                                                                DockerComposeConstants.ExternalNetworkDriver),
                        DockerComposeUtils.ValidateAndGetMapping(
                            traceContext,
                            DockerComposeConstants.ExternalNetworkDriver,
                            item.Value),
                        ignoredKeys);

                    break;
                }

                default:
                {
                    // Parse custom network's when we add that support in our product
                    break;
                }
                }
            }
        }
        private void ParseServices(string context, YamlMappingNode servicesRootNode, HashSet <string> ignoredKeys)
        {
            foreach (var childItem in servicesRootNode.Children)
            {
                var name = childItem.Key.ToString();
                DockerComposeUtils.ValidateAndGetMapping(context, name, childItem.Value);

                var serviceTypeDesc = new ComposeServiceTypeDescription(name, this.ApplicationTypeVersion);
                serviceTypeDesc.Parse(
                    DockerComposeUtils.GenerateTraceContext(context, name),
                    childItem.Value,
                    ignoredKeys);

                this.ServiceTypeDescriptions.Add(name, serviceTypeDesc);
            }
        }
        public override void Parse(string traceContext, YamlNode node, HashSet <string> ignoredKeys)
        {
            var resourcesRootNode = DockerComposeUtils.ValidateAndGetMapping(traceContext, "", node);

            foreach (var childItem in resourcesRootNode.Children)
            {
                string key = childItem.Key.ToString();
                switch (childItem.Key.ToString())
                {
                case DockerComposeConstants.ResourceLimitsKey:
                {
                    this.ParseLimits(
                        DockerComposeUtils.GenerateTraceContext(traceContext, DockerComposeConstants.ResourceLimitsKey),
                        DockerComposeUtils.ValidateAndGetMapping(traceContext, DockerComposeConstants.ResourceLimitsKey, childItem.Value));

                    break;
                }

                case DockerComposeConstants.ResourceReservationsKey:
                {
                    this.ParseReservations(
                        DockerComposeUtils.GenerateTraceContext(traceContext, DockerComposeConstants.ResourceReservationsKey),
                        DockerComposeUtils.ValidateAndGetMapping(traceContext, DockerComposeConstants.ResourceReservationsKey, childItem.Value));

                    break;
                }

                case DockerComposeConstants.LabelsKey:
                {
                    // ignored
                    break;
                }

                default:
                {
                    ignoredKeys.Add(key);
                    break;
                }
                }
            }
        }
        private void ParseLimits(string traceContext, YamlMappingNode limitsNode)
        {
            foreach (var childItem in limitsNode.Children)
            {
                string key = childItem.Key.ToString();
                switch (childItem.Key.ToString())
                {
                case DockerComposeConstants.CpuSharesKey:
                {
                    this.LimitCpuShares = DockerComposeUtils.ValidateAndGetScalar(traceContext, DockerComposeConstants.CpuSharesKey, childItem.Value).ToString();
                    break;
                }

                case DockerComposeConstants.CpusKey:
                {
                    this.LimitCpus = DockerComposeUtils.ValidateAndGetScalar(traceContext, DockerComposeConstants.CpusKey, childItem.Value).ToString();
                    break;
                }

                case DockerComposeConstants.MemoryKey:
                {
                    this.LimitMemoryInMb = this.NormalizeToMb(
                        DockerComposeUtils.GenerateTraceContext(traceContext, DockerComposeConstants.MemoryKey),
                        DockerComposeUtils.ValidateAndGetScalar(traceContext, DockerComposeConstants.MemoryKey, childItem.Value).ToString());

                    break;
                }

                case DockerComposeConstants.MemorySwapKey:
                {
                    this.LimitMemorySwapInMb = this.NormalizeToMb(
                        DockerComposeUtils.GenerateTraceContext(traceContext, DockerComposeConstants.MemorySwapKey),
                        DockerComposeUtils.ValidateAndGetScalar(traceContext, DockerComposeConstants.MemorySwapKey, childItem.Value).ToString());
                    break;
                }
                }
            }
        }
        public override void Parse(string traceContext, YamlNode node, HashSet <string> ignoredKeys)
        {
            var serviceRootNode = DockerComposeUtils.ValidateAndGetMapping(traceContext, "", node);

            foreach (var childItem in serviceRootNode.Children)
            {
                var key = childItem.Key.ToString();
                switch (childItem.Key.ToString())
                {
                case DockerComposeConstants.ImageKey:
                {
                    this.ImageName = DockerComposeUtils.ValidateAndGetScalar(
                        traceContext,
                        DockerComposeConstants.ImageKey,
                        childItem.Value).ToString();

                    this.ParseImageTag(this.ImageName);
                    break;
                }

                case DockerComposeConstants.PortsKey:
                {
                    this.ParsePorts(
                        DockerComposeUtils.GenerateTraceContext(traceContext, DockerComposeConstants.PortsKey),
                        DockerComposeUtils.ValidateAndGetSequence(traceContext, DockerComposeConstants.PortsKey, childItem.Value),
                        ignoredKeys);

                    break;
                }

                case DockerComposeConstants.DeployKey:
                {
                    this.ParseDeploymentParameters(
                        DockerComposeUtils.GenerateTraceContext(traceContext, DockerComposeConstants.DeployKey),
                        DockerComposeUtils.ValidateAndGetMapping(traceContext, DockerComposeConstants.DeployKey, childItem.Value),
                        ignoredKeys);

                    break;
                }

                case DockerComposeConstants.EntryPointKey:
                {
                    this.EntryPointOverride = DockerComposeUtils.ValidateAndGetScalar(
                        traceContext,
                        DockerComposeConstants.ImageKey,
                        childItem.Value).ToString();

                    break;
                }

                case DockerComposeConstants.CommandKey:
                {
                    this.Commands = DockerComposeUtils.ValidateAndGetScalar(
                        traceContext,
                        DockerComposeConstants.ImageKey,
                        childItem.Value).ToString();

                    break;
                }

                case DockerComposeConstants.LoggingKey:
                {
                    DockerComposeUtils.ValidateAndGetMapping(traceContext, DockerComposeConstants.LoggingKey, childItem.Value);

                    this.LoggingOptions.Parse(
                        DockerComposeUtils.GenerateTraceContext(traceContext, DockerComposeConstants.LoggingKey),
                        DockerComposeUtils.ValidateAndGetMapping(traceContext, DockerComposeConstants.LoggingKey, childItem.Value),
                        ignoredKeys);

                    break;
                }

                case DockerComposeConstants.VolumesKey:
                {
                    this.ParseVolumeMappings(
                        DockerComposeUtils.GenerateTraceContext(traceContext, DockerComposeConstants.VolumesKey),
                        DockerComposeUtils.ValidateAndGetSequence(traceContext, DockerComposeConstants.VolumesKey, childItem.Value),
                        ignoredKeys);

                    break;
                }

                case DockerComposeConstants.EnvironmentKey:
                {
                    if (childItem.Value.NodeType == YamlNodeType.Sequence)
                    {
                        this.ParseEnvironment(
                            DockerComposeUtils.GenerateTraceContext(traceContext,
                                                                    DockerComposeConstants.EnvironmentKey),
                            DockerComposeUtils.ValidateAndGetSequence(traceContext,
                                                                      DockerComposeConstants.EnvironmentKey, childItem.Value));
                    }
                    else if (childItem.Value.NodeType == YamlNodeType.Mapping)
                    {
                        this.ParseEnvironment(
                            DockerComposeUtils.GenerateTraceContext(traceContext,
                                                                    DockerComposeConstants.EnvironmentKey),
                            DockerComposeUtils.ValidateAndGetMapping(traceContext,
                                                                     DockerComposeConstants.EnvironmentKey, childItem.Value));
                    }
                    else
                    {
                        throw new FabricComposeException(
                                  string.Format("{0} - {1} expects a sequence or mapping element.", traceContext, DockerComposeConstants.EnvironmentKey));
                    }
                    break;
                }

                case DockerComposeConstants.IsolationKey:
                {
                    this.Isolation = DockerComposeUtils.ValidateAndGetScalar(
                        traceContext,
                        DockerComposeConstants.IsolationKey,
                        childItem.Value).ToString();

                    if (this.Isolation != DockerComposeConstants.IsolationValueDefault &&
                        this.Isolation != DockerComposeConstants.IsolationValueProcess &&
                        this.Isolation != DockerComposeConstants.IsolationValueHyperv)
                    {
                        throw new FabricComposeException(string.Format("{0} - Invalid value {1} specified for isolation", traceContext, this.Isolation));
                    }
                    break;
                }

                case DockerComposeConstants.LabelsKey:
                {
                    // ignored.
                    break;
                }

                default:
                {
                    // TODO: logging.
                    ignoredKeys.Add(key);
                    break;
                }
                }
            }
        }
        internal void ParseDeploymentParameters(string traceContext, YamlMappingNode rootDeployNode, HashSet <string> ignoredKeys)
        {
            foreach (var item in rootDeployNode)
            {
                var key = item.Key.ToString();
                switch (key)
                {
                case DockerComposeConstants.DeploymentModeKey:
                {
                    var value = item.Value.ToString();
                    if (value != DockerComposeConstants.DeploymentModeReplicatedValue)
                    {
                        throw new FabricComposeException(
                                  string.Format("{0} - Only 'replicated' deployment mode is supported. Specified {1}", traceContext, value));
                    }
                    break;
                }

                case DockerComposeConstants.ReplicasKey:
                {
                    var value = DockerComposeUtils.ValidateAndGetScalar(traceContext, DockerComposeConstants.ReplicasKey, item.Value).ToString();
                    try
                    {
                        this.InstanceCount = Int32.Parse(value);
                    }
                    catch (Exception e)
                    {
                        throw new FabricComposeException(string.Format("{0} - Parsing 'replicas' with value {1} failed", e, value));
                    }
                    break;
                }

                case DockerComposeConstants.PlacementKey:
                {
                    this.ParsePlacementConstraints(
                        DockerComposeUtils.GenerateTraceContext(traceContext, DockerComposeConstants.PlacementKey),
                        DockerComposeUtils.ValidateAndGetMapping(traceContext, DockerComposeConstants.PlacementKey, item.Value));
                    break;
                }

                case DockerComposeConstants.ResourcesKey:
                {
                    this.ParseResourceGovernance(
                        DockerComposeUtils.GenerateTraceContext(traceContext, DockerComposeConstants.ResourcesKey),
                        DockerComposeUtils.ValidateAndGetMapping(traceContext, DockerComposeConstants.ResourcesKey, item.Value),
                        ignoredKeys);
                    break;
                }

                case DockerComposeConstants.LabelsKey:
                {
                    break;
                }

                default:
                {
                    ignoredKeys.Add(key);
                    break;
                }
                }
            }
        }
        public override void Parse(string traceContext, YamlNode node, HashSet <string> ignoredKeys)
        {
            var rootNode = DockerComposeUtils.ValidateAndGetMapping(traceContext, "Root", node);

            foreach (var childItem in rootNode.Children)
            {
                var key = childItem.Key.ToString();
                switch (key)
                {
                case DockerComposeConstants.VersionKey:
                {
                    this.DockerComposeVersion = childItem.Value.ToString();

                    if (!this.DockerComposeVersion
                        .StartsWith(DockerComposeConstants.SupportedDockerComposeVersion3) &&
                        !this.DockerComposeVersion
                        .StartsWith(DockerComposeConstants.SupportedDockerComposeVersion2))
                    {
                        throw new FabricComposeException(
                                  string.Format(
                                      "Docker compose file version not supported. Supported version - '3' input file version - '{0}'",
                                      childItem.Value.ToString()));
                    }

                    break;
                }

                case DockerComposeConstants.ServicesKey:
                {
                    this.ParseServices(
                        DockerComposeUtils.GenerateTraceContext(traceContext, DockerComposeConstants.ServicesKey),
                        DockerComposeUtils.ValidateAndGetMapping(traceContext, DockerComposeConstants.ServicesKey, childItem.Value),
                        ignoredKeys);
                    break;
                }

                case DockerComposeConstants.VolumesKey:
                {
                    this.ParseVolumes(
                        DockerComposeUtils.GenerateTraceContext(traceContext, DockerComposeConstants.VolumesKey),
                        DockerComposeUtils.ValidateAndGetMapping(traceContext, DockerComposeConstants.VolumesKey, childItem.Value),
                        ignoredKeys);
                    break;
                }

                case DockerComposeConstants.LabelsKey:
                {
                    this.ParseLabels(
                        DockerComposeUtils.GenerateTraceContext(traceContext, DockerComposeConstants.LabelsKey),
                        DockerComposeUtils.ValidateAndGetMapping(traceContext, DockerComposeConstants.LabelsKey, childItem.Value));
                    break;
                }

                case DockerComposeConstants.NetworksKey:
                {
                    this.ParseNetworks(
                        DockerComposeUtils.GenerateTraceContext(traceContext, DockerComposeConstants.NetworksKey),
                        DockerComposeUtils.ValidateAndGetMapping(traceContext, DockerComposeConstants.NetworksKey, childItem.Value),
                        ignoredKeys);
                    break;
                }

                default:
                {
                    ignoredKeys.Add(key);
                    break;
                }
                }
            }
        }