Example #1
0
        private async Task AddOutboundConnectivityToContainerAsync()
        {
            var netwrokParams = new NetworkConnectConfig()
            {
                Container = this.containerId
            };

            FabricException opEx = null;

            try
            {
                await Utility.ExecuteWithRetriesAsync(
                    (operationTimeout) =>
                {
                    return(this.activator.Client.NetworkOperation.ConnectNetworkAsync(
                               "nat",
                               netwrokParams,
                               operationTimeout));
                },
                    $"AddOutboundConnectivityToContainerAsync_{this.ContainerName}",
                    TraceType,
                    HostingConfig.Config.DockerRequestTimeout,
                    this.timeoutHelper.RemainingTime);

                HostingTrace.Source.WriteNoise(
                    TraceType,
                    "Adding outbound connectivity to {0} succeeded.",
                    BuildContainerInfoMessage());
            }
            catch (Exception ex)
            {
                var errorMessage = string.Format(
                    "Adding outbound connectivity failed for {0}",
                    this.BuildErrorMessage(ex));

                HostingTrace.Source.WriteError(TraceType, errorMessage);
                opEx = new FabricException(errorMessage, FabricErrorCode.InvalidOperation);
            }

            if (opEx != null)
            {
                await this.CleanupOnErrorAsync(opEx);
            }
        }
Example #2
0
        /// <summary>
        ///  Expected return error code:
        ///     200 No error
        ///     403 Operation not supported for swarm scoped networks
        ///     404 Network or container not found
        ///     500 server error
        /// </summary>
        internal async Task ConnectNetworkAsync(
            string networkIdOrName,
            NetworkConnectConfig connectConfig,
            TimeSpan timeout)
        {
            var requestPath = $"networks/{networkIdOrName}/connect";

            var requestContent = JsonRequestContent.GetContent(connectConfig);

            var response = await this.client.MakeRequestAsync(
                HttpMethod.Post,
                requestPath,
                null,
                requestContent,
                timeout).ConfigureAwait(false);

            if (response.StatusCode != HttpStatusCode.OK)
            {
                throw new ContainerApiException(response.StatusCode, response.Body);
            }
        }
        private async Task AddOutboundConnectivityToContainerAsync()
        {
            // If container is using open network only on windows, we need additional set up before and after
            // starting the container. This is a mitigation for no support for outbound connectivity from
            // open network based containers.
            if ((this.activationArgs.ContainerDescription.ContainerNetworkConfig.NetworkType & ContainerNetworkType.Open) == ContainerNetworkType.Open &&
                !string.IsNullOrEmpty(this.activationArgs.ContainerDescription.ContainerNetworkConfig.OpenNetworkAssignedIp) &&
                (this.activationArgs.ContainerDescription.ContainerNetworkConfig.NetworkType & ContainerNetworkType.Isolated) != ContainerNetworkType.Isolated)
            {
                var netwrokParams = new NetworkConnectConfig()
                {
                    Container = this.containerId
                };

                FabricException opEx = null;

                try
                {
                    await Utility.ExecuteWithRetryOnTimeoutAsync(
                        (operationTimeout) =>
                    {
                        return(this.activator.Client.NetworkOperation.ConnectNetworkAsync(
                                   "nat",
                                   netwrokParams,
                                   operationTimeout));
                    },
                        $"AddOutboundConnectivityToContainerAsync_{this.ContainerName}",
                        TraceType,
                        HostingConfig.Config.DockerRequestTimeout,
                        this.timeoutHelper.RemainingTime);

                    HostingTrace.Source.WriteNoise(
                        TraceType,
                        "Adding outbound connectivity to {0} succeeded.",
                        BuildContainerInfoMessage());
                }
                catch (Exception ex)
                {
                    var errorMessage = string.Format(
                        "Adding outbound connectivity failed for {0}",
                        Utility.BuildErrorMessage(
                            activationArgs.ContainerDescription.ContainerName,
                            activationArgs.ContainerDescription.ApplicationId,
                            activationArgs.ContainerDescription.ApplicationName,
                            ex));

                    HostingTrace.Source.WriteError(TraceType, errorMessage);
                    opEx = new FabricException(errorMessage, FabricErrorCode.InvalidOperation);
                }

                if (opEx != null)
                {
                    await Utility.CleanupOnErrorAsync(
                        TraceType,
                        activationArgs.ContainerDescription.AutoRemove,
                        activationArgs.ContainerDescription.IsContainerRoot,
                        activationArgs.ProcessDescription.CgroupName,
                        activationArgs.ContainerDescription.ContainerName,
                        activationArgs.ContainerDescription.ApplicationId,
                        activator,
                        timeoutHelper,
                        opEx);
                }
            }
        }