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); } }
/// <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); } } }