コード例 #1
0
        public override void Invoke(AWSCredentials creds, RegionEndpoint region, int maxItems)
        {
            AmazonStorageGatewayConfig config = new AmazonStorageGatewayConfig();

            config.RegionEndpoint = region;
            ConfigureClient(config);
            AmazonStorageGatewayClient client = new AmazonStorageGatewayClient(creds, config);

            ListVolumesResponse resp = new ListVolumesResponse();

            do
            {
                ListVolumesRequest req = new ListVolumesRequest
                {
                    Marker = resp.Marker
                    ,
                    Limit = maxItems
                };

                resp = client.ListVolumes(req);
                CheckError(resp.HttpStatusCode, "200");

                foreach (var obj in resp.VolumeInfos)
                {
                    AddObject(obj);
                }
            }while (!string.IsNullOrEmpty(resp.Marker));
        }
コード例 #2
0
        /// <summary>
        /// Unmarshaller the response from the service to the response class.
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override AmazonWebServiceResponse Unmarshall(JsonUnmarshallerContext context)
        {
            ListVolumesResponse response = new ListVolumesResponse();

            context.Read();
            int targetDepth = context.CurrentDepth;

            while (context.ReadAtDepth(targetDepth))
            {
                if (context.TestExpression("GatewayARN", targetDepth))
                {
                    var unmarshaller = StringUnmarshaller.Instance;
                    response.GatewayARN = unmarshaller.Unmarshall(context);
                    continue;
                }
                if (context.TestExpression("Marker", targetDepth))
                {
                    var unmarshaller = StringUnmarshaller.Instance;
                    response.Marker = unmarshaller.Unmarshall(context);
                    continue;
                }
                if (context.TestExpression("VolumeInfos", targetDepth))
                {
                    var unmarshaller = new ListUnmarshaller <VolumeInfo, VolumeInfoUnmarshaller>(VolumeInfoUnmarshaller.Instance);
                    response.VolumeInfos = unmarshaller.Unmarshall(context);
                    continue;
                }
            }

            return(response);
        }
コード例 #3
0
        public static ListVolumesResponse Unmarshall(UnmarshallerContext context)
        {
            ListVolumesResponse listVolumesResponse = new ListVolumesResponse();

            listVolumesResponse.HttpResponse = context.HttpResponse;
            listVolumesResponse.RequestId    = context.StringValue("ListVolumes.RequestId");
            listVolumesResponse.TotalCount   = context.IntegerValue("ListVolumes.TotalCount");
            listVolumesResponse.PageNumber   = context.IntegerValue("ListVolumes.PageNumber");
            listVolumesResponse.PageSize     = context.IntegerValue("ListVolumes.PageSize");

            List <ListVolumesResponse.ListVolumes_VolumeInfo> listVolumesResponse_volumes = new List <ListVolumesResponse.ListVolumes_VolumeInfo>();

            for (int i = 0; i < context.Length("ListVolumes.Volumes.Length"); i++)
            {
                ListVolumesResponse.ListVolumes_VolumeInfo volumeInfo = new ListVolumesResponse.ListVolumes_VolumeInfo();
                volumeInfo.RegionId         = context.StringValue("ListVolumes.Volumes[" + i + "].RegionId");
                volumeInfo.ClusterId        = context.StringValue("ListVolumes.Volumes[" + i + "].ClusterId");
                volumeInfo.ClusterName      = context.StringValue("ListVolumes.Volumes[" + i + "].ClusterName");
                volumeInfo.VolumeId         = context.StringValue("ListVolumes.Volumes[" + i + "].VolumeId");
                volumeInfo.VolumeType       = context.StringValue("ListVolumes.Volumes[" + i + "].VolumeType");
                volumeInfo.VolumeProtocol   = context.StringValue("ListVolumes.Volumes[" + i + "].VolumeProtocol");
                volumeInfo.VolumeMountpoint = context.StringValue("ListVolumes.Volumes[" + i + "].VolumeMountpoint");
                volumeInfo.RemoteDirectory  = context.StringValue("ListVolumes.Volumes[" + i + "].RemoteDirectory");

                listVolumesResponse_volumes.Add(volumeInfo);
            }
            listVolumesResponse.Volumes = listVolumesResponse_volumes;

            return(listVolumesResponse);
        }
コード例 #4
0
        public override AmazonWebServiceResponse Unmarshall(JsonUnmarshallerContext context)
        {
            ListVolumesResponse response = new ListVolumesResponse();

            context.Read();
            response.ListVolumesResult = ListVolumesResultUnmarshaller.GetInstance().Unmarshall(context);

            return(response);
        }
コード例 #5
0
        public override AmazonWebServiceResponse Unmarshall(JsonUnmarshallerContext context)
        {
            ListVolumesResponse response = new ListVolumesResponse();

            context.Read();

            UnmarshallResult(context, response);
            return(response);
        }
コード例 #6
0
        private static void UnmarshallResult(JsonUnmarshallerContext context, ListVolumesResponse response)
        {
            int originalDepth = context.CurrentDepth;
            int targetDepth   = originalDepth + 1;

            while (context.Read())
            {
                if (context.TestExpression("GatewayARN", targetDepth))
                {
                    context.Read();
                    response.GatewayARN = StringUnmarshaller.GetInstance().Unmarshall(context);
                    continue;
                }

                if (context.TestExpression("Marker", targetDepth))
                {
                    context.Read();
                    response.Marker = StringUnmarshaller.GetInstance().Unmarshall(context);
                    continue;
                }

                if (context.TestExpression("VolumeInfos", targetDepth))
                {
                    context.Read();
                    response.VolumeInfos = new List <VolumeInfo>();
                    VolumeInfoUnmarshaller unmarshaller = VolumeInfoUnmarshaller.GetInstance();
                    while (context.Read())
                    {
                        JsonToken token = context.CurrentTokenType;
                        if (token == JsonToken.ArrayStart)
                        {
                            continue;
                        }
                        if (token == JsonToken.ArrayEnd)
                        {
                            break;
                        }
                        response.VolumeInfos.Add(unmarshaller.Unmarshall(context));
                    }
                    continue;
                }

                if (context.CurrentDepth <= originalDepth)
                {
                    return;
                }
            }

            return;
        }
コード例 #7
0
 public override string ExecuteCommand()
 {
     try
     {
         var contentResult = base.ExecuteCommand();
         var result        = JsonConvert.DeserializeObject <ListVolumesResponseDto>(contentResult);
         ListVolumesResponse = result.ListVolumesResponse;
     }
     catch (Exception e)
     {
         LogHelper.WriteAllLog(e.Message, LogHelper.LogType.Error);
         throw;
     }
     return(string.Empty);
 }
コード例 #8
0
        public static ListVolumesResponse Unmarshall(UnmarshallerContext _ctx)
        {
            ListVolumesResponse listVolumesResponse = new ListVolumesResponse();

            listVolumesResponse.HttpResponse = _ctx.HttpResponse;
            listVolumesResponse.RequestId    = _ctx.StringValue("ListVolumes.RequestId");
            listVolumesResponse.TotalCount   = _ctx.IntegerValue("ListVolumes.TotalCount");
            listVolumesResponse.PageNumber   = _ctx.IntegerValue("ListVolumes.PageNumber");
            listVolumesResponse.PageSize     = _ctx.IntegerValue("ListVolumes.PageSize");

            List <ListVolumesResponse.ListVolumes_VolumeInfo> listVolumesResponse_volumes = new List <ListVolumesResponse.ListVolumes_VolumeInfo>();

            for (int i = 0; i < _ctx.Length("ListVolumes.Volumes.Length"); i++)
            {
                ListVolumesResponse.ListVolumes_VolumeInfo volumeInfo = new ListVolumesResponse.ListVolumes_VolumeInfo();
                volumeInfo.RegionId         = _ctx.StringValue("ListVolumes.Volumes[" + i + "].RegionId");
                volumeInfo.ClusterId        = _ctx.StringValue("ListVolumes.Volumes[" + i + "].ClusterId");
                volumeInfo.ClusterName      = _ctx.StringValue("ListVolumes.Volumes[" + i + "].ClusterName");
                volumeInfo.VolumeId         = _ctx.StringValue("ListVolumes.Volumes[" + i + "].VolumeId");
                volumeInfo.VolumeType       = _ctx.StringValue("ListVolumes.Volumes[" + i + "].VolumeType");
                volumeInfo.VolumeProtocol   = _ctx.StringValue("ListVolumes.Volumes[" + i + "].VolumeProtocol");
                volumeInfo.VolumeMountpoint = _ctx.StringValue("ListVolumes.Volumes[" + i + "].VolumeMountpoint");
                volumeInfo.RemoteDirectory  = _ctx.StringValue("ListVolumes.Volumes[" + i + "].RemoteDirectory");

                List <ListVolumesResponse.ListVolumes_VolumeInfo.ListVolumes_VolumeInfo1> volumeInfo_additionalVolumes = new List <ListVolumesResponse.ListVolumes_VolumeInfo.ListVolumes_VolumeInfo1>();
                for (int j = 0; j < _ctx.Length("ListVolumes.Volumes[" + i + "].AdditionalVolumes.Length"); j++)
                {
                    ListVolumesResponse.ListVolumes_VolumeInfo.ListVolumes_VolumeInfo1 volumeInfo1 = new ListVolumesResponse.ListVolumes_VolumeInfo.ListVolumes_VolumeInfo1();
                    volumeInfo1.VolumeType       = _ctx.StringValue("ListVolumes.Volumes[" + i + "].AdditionalVolumes[" + j + "].VolumeType");
                    volumeInfo1.VolumeId         = _ctx.StringValue("ListVolumes.Volumes[" + i + "].AdditionalVolumes[" + j + "].VolumeId");
                    volumeInfo1.VolumeProtocol   = _ctx.StringValue("ListVolumes.Volumes[" + i + "].AdditionalVolumes[" + j + "].VolumeProtocol");
                    volumeInfo1.VolumeMountpoint = _ctx.StringValue("ListVolumes.Volumes[" + i + "].AdditionalVolumes[" + j + "].VolumeMountpoint");
                    volumeInfo1.RemoteDirectory  = _ctx.StringValue("ListVolumes.Volumes[" + i + "].AdditionalVolumes[" + j + "].RemoteDirectory");
                    volumeInfo1.LocalDirectory   = _ctx.StringValue("ListVolumes.Volumes[" + i + "].AdditionalVolumes[" + j + "].LocalDirectory");
                    volumeInfo1.Role             = _ctx.StringValue("ListVolumes.Volumes[" + i + "].AdditionalVolumes[" + j + "].Role");
                    volumeInfo1.Location         = _ctx.StringValue("ListVolumes.Volumes[" + i + "].AdditionalVolumes[" + j + "].Location");
                    volumeInfo1.JobQueue         = _ctx.StringValue("ListVolumes.Volumes[" + i + "].AdditionalVolumes[" + j + "].JobQueue");

                    volumeInfo_additionalVolumes.Add(volumeInfo1);
                }
                volumeInfo.AdditionalVolumes = volumeInfo_additionalVolumes;

                listVolumesResponse_volumes.Add(volumeInfo);
            }
            listVolumesResponse.Volumes = listVolumesResponse_volumes;

            return(listVolumesResponse);
        }
コード例 #9
0
        public ICommandResponse ParseResponse(WebResponse webResponse)
        {
            var response       = new ListVolumesResponse();
            var responseStream = webResponse.GetResponseStream();

            if ((responseStream != null) && (responseStream.CanRead))
            {
                var responseDocument = XDocument.Load(responseStream);
                response.Volumes =
                    responseDocument.Root.Elements()
                    .Where(e => e.Name.LocalName.Equals("volume", StringComparison.InvariantCultureIgnoreCase))
                    .Select(Machine.From);
            }

            return(response);
        }
コード例 #10
0
        public override async Task <ListVolumesResponse> ListVolumes(ListVolumesRequest request, ServerCallContext context)
        {
            //todo request.MaxEntries,
            //request.StartingToken

            var volumeSource = _service.GetVolumesAsync(null);

            if (!string.IsNullOrEmpty(request.StartingToken))
            {
                if (!int.TryParse(request.StartingToken, out var startIndex))
                {
                    throw new RpcException(new Status(StatusCode.Aborted, string.Empty),
                                           "invalid starting_token");
                }

                volumeSource = volumeSource.Skip(startIndex);
            }

            if (request.MaxEntries > 0)
            {
                volumeSource = volumeSource.Take(request.MaxEntries);
            }

            var foundVolumes = await volumeSource
                               .ToListAsync(context.CancellationToken);

            var flows = await _service.GetVolumeFlowsAsnyc(null)
                        .ToListAsync(context.CancellationToken);

            var nextIndex = request.MaxEntries + foundVolumes.Count;

            var rsp = new ListVolumesResponse
            {
                NextToken = request.MaxEntries > 0 ? nextIndex.ToString() : string.Empty
            };

            foreach (var foundVolume in foundVolumes)
            {
                var volumeFlows = flows.Where(n => StringComparer.OrdinalIgnoreCase.Equals(foundVolume.Path, n.Path)).ToList();

                var hostNames = volumeFlows.Select(n => n.Host)
                                .Distinct(StringComparer.OrdinalIgnoreCase)
                                .DefaultIfEmpty(null);

                var errors           = new List <Exception>();
                HypervVolumeDetail v = null;

                foreach (var hostName in hostNames)
                {
                    //maybe stale record after remount to other node

                    try
                    {
                        v = await _service.GetVolumeAsync(foundVolume.Path, hostName, context.CancellationToken);

                        continue;
                    }
                    catch (Exception ex)
                    {
                        errors.Add(new Exception($"Getting volume details of '{foundVolume.Name}' at host '{hostName ?? "default"}' failed.", ex));
                    }
                }

                if (v is null)
                {
                    throw errors.Count switch
                          {
                              1 => errors[0],
                              _ => new AggregateException($"Getting volume details of '{foundVolume.Name}' failed.", errors),
                          };
                }

                var entry = new ListVolumesResponse.Types.Entry
                {
                    Volume = new Volume
                    {
                        VolumeId      = foundVolume.Name,
                        CapacityBytes = (long)v.SizeBytes,
                        //AccessibleTopology
                        //ContentSource
                    },
                    Status = new ListVolumesResponse.Types.VolumeStatus
                    {
                    }
                };
                entry.Volume.VolumeContext.Add("Id", v.Id.ToString());
                entry.Volume.VolumeContext.Add("Storage", v.Storage);
                entry.Volume.VolumeContext.Add("Path", v.Path);

                entry.Status.PublishedNodeIds.Add(volumeFlows.Select(n => n.VMId.ToString()));

                rsp.Entries.Add(entry);
            }

            return(rsp);
        }
コード例 #11
0
        public override async Task <ListVolumesResponse> ListVolumes(ListVolumesRequest request, ServerCallContext context)
        {
            _logger.LogDebug("list volumes from index {StartIndex}", request.StartingToken);

            //todo cache query
            var volumes = await _service.GetVolumesAsync(null).ToListAsync(context.CancellationToken);

            var startIndex = 0;

            if (!string.IsNullOrEmpty(request.StartingToken))
            {
                if (!int.TryParse(request.StartingToken, out startIndex))
                {
                    throw new RpcException(new Status(StatusCode.InvalidArgument, "invalid starting_token"));
                }
            }

            var rsp = new ListVolumesResponse
            {
            };

            if (request.MaxEntries > 0 && (volumes.Count - startIndex) > request.MaxEntries)
            {
                rsp.NextToken = (startIndex + request.MaxEntries).ToString();
            }

            var volumeSource = volumes.AsEnumerable();

            if (startIndex > 0)
            {
                volumeSource = volumeSource.Skip(startIndex);
            }

            if (request.MaxEntries > 0)
            {
                volumeSource = volumeSource.Take(request.MaxEntries);
            }

            await foreach (var r in _service.GetVolumeDetailsAsync(volumeSource, context.CancellationToken))
            {
                var entry = new ListVolumesResponse.Types.Entry
                {
                    Volume = new Volume
                    {
                        VolumeId = r.Info.Name
                                   //AccessibleTopology
                                   //ContentSource
                    },
                    Status = new ListVolumesResponse.Types.VolumeStatus
                    {
                    }
                };

                if (r.Detail is not null)
                {
                    var d = r.Detail;
                    entry.Volume.CapacityBytes = (long)(d.SizeBytes);
                    entry.Volume.VolumeContext.Add("Id", d.Id.ToString());
                    entry.Volume.VolumeContext.Add("Storage", d.Storage);
                    entry.Volume.VolumeContext.Add("Path", d.Path);
                    entry.Status.VolumeCondition = new VolumeCondition
                    {
                        Abnormal = false,
                        Message  = d.Attached ? "attached" : "detached"
                    };
                }

                if (r.Nodes.Length > 0)
                {
                    entry.Status.PublishedNodeIds.Add(r.Nodes);
                }

                if (r.Error is not null)
                {
                    entry.Status.VolumeCondition = new VolumeCondition
                    {
                        Abnormal = true,
                        Message  = r.Error.Message
                    };
                }

                rsp.Entries.Add(entry);
            }

            return(rsp);
        }