public override void Invoke(AWSCredentials creds, RegionEndpoint region, int maxItems) { AmazonEC2Config config = new AmazonEC2Config(); config.RegionEndpoint = region; ConfigureClient(config); AmazonEC2Client client = new AmazonEC2Client(creds, config); DescribeVolumesResponse resp = new DescribeVolumesResponse(); do { DescribeVolumesRequest req = new DescribeVolumesRequest { NextToken = resp.NextToken , MaxResults = maxItems }; resp = client.DescribeVolumes(req); CheckError(resp.HttpStatusCode, "200"); foreach (var obj in resp.Volumes) { AddObject(obj); } }while (!string.IsNullOrEmpty(resp.NextToken)); }
/// <summary> /// List all volumes found in region /// </summary> public static void ListVolumes() { var ec2 = Ec2Helper.CreateClient(); DescribeVolumesRequest rq = new DescribeVolumesRequest(); DescribeVolumesResponse rs = ec2.DescribeVolumes(rq); foreach (Volume v in rs.Volumes) { Console.WriteLine(v.VolumeId); DescribeTagsRequest trq = new DescribeTagsRequest(); trq.Filters.Add(new Filter() { Name = "resource-id", Values = new List <string>() { v.VolumeId } }); DescribeTagsResponse trs = ec2.DescribeTags(trq); foreach (TagDescription t in trs.Tags) { Console.WriteLine(" " + t.Key + "=" + t.Value); } } }
/// <summary> /// Unmarshaller the response from the service to the response class. /// </summary> /// <param name="context"></param> /// <returns></returns> public override AmazonWebServiceResponse Unmarshall(JsonUnmarshallerContext context) { DescribeVolumesResponse response = new DescribeVolumesResponse(); context.Read(); int targetDepth = context.CurrentDepth; while (context.ReadAtDepth(targetDepth)) { if (context.TestExpression("NextToken", targetDepth)) { var unmarshaller = StringUnmarshaller.Instance; response.NextToken = unmarshaller.Unmarshall(context); continue; } if (context.TestExpression("Volumes", targetDepth)) { var unmarshaller = new ListUnmarshaller <Volume, VolumeUnmarshaller>(VolumeUnmarshaller.Instance); response.Volumes = unmarshaller.Unmarshall(context); continue; } } return(response); }
/// <summary> /// Unmarshaller the response from the service to the response class. /// </summary> /// <param name="context"></param> /// <returns></returns> public override AmazonWebServiceResponse Unmarshall(XmlUnmarshallerContext context) { DescribeVolumesResponse response = new DescribeVolumesResponse(); int originalDepth = context.CurrentDepth; int targetDepth = originalDepth + 1; if (context.IsStartOfDocument) { targetDepth = 2; } while (context.ReadAtDepth(originalDepth)) { if (context.IsStartElement || context.IsAttribute) { if (context.TestExpression("nextToken", targetDepth)) { var unmarshaller = StringUnmarshaller.Instance; response.NextToken = unmarshaller.Unmarshall(context); continue; } if (context.TestExpression("volumeSet/item", targetDepth)) { var unmarshaller = VolumeUnmarshaller.Instance; var item = unmarshaller.Unmarshall(context); response.Volumes.Add(item); continue; } } } return(response); }
/// <summary> /// List all volumes found in region /// </summary> public static void ListVolumes() { AmazonEC2 ec2 = Ec2Helper.CreateClient(); DescribeVolumesRequest rq = new DescribeVolumesRequest(); DescribeVolumesResponse rs = ec2.DescribeVolumes(rq); foreach (Volume v in rs.DescribeVolumesResult.Volume) { Console.WriteLine(v.VolumeId); DescribeTagsRequest trq = new DescribeTagsRequest(); trq.WithFilter(new Filter() { Name = "resource-id", Value = new List <string>() { v.VolumeId } }); DescribeTagsResponse trs = ec2.DescribeTags(trq); foreach (ResourceTag t in trs.DescribeTagsResult.ResourceTag) { Console.WriteLine(" " + t.Key + "=" + t.Value); } } }
private DescribeVolumesResponse GetEbsVolumes() { DescribeVolumesRequest request = new DescribeVolumesRequest(); DescribeVolumesResponse resp = ec2.DescribeVolumes(request); return(resp); }
public override AmazonWebServiceResponse Unmarshall(JsonUnmarshallerContext context) { DescribeVolumesResponse response = new DescribeVolumesResponse(); context.Read(); UnmarshallResult(context, response); return(response); }
public override AmazonWebServiceResponse Unmarshall(JsonUnmarshallerContext context) { DescribeVolumesResponse response = new DescribeVolumesResponse(); context.Read(); response.DescribeVolumesResult = DescribeVolumesResultUnmarshaller.GetInstance().Unmarshall(context); return(response); }
public AwsObjectRetriever(string accessKeyID, string secretKeyID, Amazon.RegionEndpoint region, ILogProvider logProvider, IStatusProvider statusProvider) { _logProvider = logProvider; _statusProvider = statusProvider; createEC2Client(accessKeyID, secretKeyID, region); createLBClient(accessKeyID, secretKeyID, region); REGION = region.SystemName; _vpcs = GetAllVpcs(); _instances = GetAllInstances(); _volumes = GetAllVolumes(); Application.DoEvents(); _Loadbalancers = GetAllLBs(); }
public static void GetTopology() { IAmazonEC2 ec2 = AWSClientFactory.CreateAmazonEC2Client(); IAmazonAutoScaling asg = AWSClientFactory.CreateAmazonAutoScalingClient(); IAmazonElasticLoadBalancing elb = AWSClientFactory.CreateAmazonElasticLoadBalancingClient(); DescribeVpcsResponse vpcResponse = ec2.DescribeVpcs(); WriteFile("vpcs.csv", vpcResponse.Vpcs); DescribeInstancesResponse instanceResponse = ec2.DescribeInstances(); var reservationIndex = 0; foreach (var reservation in instanceResponse.Reservations) { if (reservationIndex == 0) { WriteFile("instances.csv", reservation.Instances); } else { AppendFile("instances.csv", reservation.Instances); } reservationIndex++; } DescribeNetworkAclsResponse naclResponse = ec2.DescribeNetworkAcls(); WriteFile("nacls.csv", naclResponse.NetworkAcls); Amazon.EC2.Model.DescribeTagsResponse tagsResponse = ec2.DescribeTags(); WriteFile("tags.csv", tagsResponse.Tags); DescribeVolumesResponse volumesResponse = ec2.DescribeVolumes(); WriteFile("volumes.csv", volumesResponse.Volumes); DescribeLoadBalancersResponse elbResponse = elb.DescribeLoadBalancers(); WriteFile("elbs.csv", elbResponse.LoadBalancerDescriptions); DescribeInternetGatewaysResponse igResponse = ec2.DescribeInternetGateways(); WriteFile("igs.csv", igResponse.InternetGateways); }
public override void Invoke(AWSCredentials creds, RegionEndpoint region, int maxItems) { AmazonOpsWorksConfig config = new AmazonOpsWorksConfig(); config.RegionEndpoint = region; ConfigureClient(config); AmazonOpsWorksClient client = new AmazonOpsWorksClient(creds, config); DescribeVolumesResponse resp = new DescribeVolumesResponse(); DescribeVolumesRequest req = new DescribeVolumesRequest { }; resp = client.DescribeVolumes(req); CheckError(resp.HttpStatusCode, "200"); foreach (var obj in resp.Volumes) { AddObject(obj); } }
public override AmazonWebServiceResponse Unmarshall(XmlUnmarshallerContext context) { DescribeVolumesResponse response = new DescribeVolumesResponse(); int targetDepth = 2; while (context.Read()) { if (context.IsStartElement || context.IsAttribute) { if (context.TestExpression("volumeSet/item", targetDepth)) { response.Volumes.Add(VolumeUnmarshaller.GetInstance().Unmarshall(context)); continue; } } } return(response); }
private static void UnmarshallResult(JsonUnmarshallerContext context, DescribeVolumesResponse response) { int originalDepth = context.CurrentDepth; int targetDepth = originalDepth + 1; while (context.Read()) { if (context.TestExpression("Volumes", targetDepth)) { context.Read(); response.Volumes = new List <Volume>(); VolumeUnmarshaller unmarshaller = VolumeUnmarshaller.GetInstance(); while (context.Read()) { JsonToken token = context.CurrentTokenType; if (token == JsonToken.ArrayStart) { continue; } if (token == JsonToken.ArrayEnd) { break; } response.Volumes.Add(unmarshaller.Unmarshall(context)); } continue; } if (context.CurrentDepth <= originalDepth) { return; } } return; }
public List <InstanceDetail> GetVMProperties() { List <AWSProfile> profile; profile = SqlHelper.GetAWSAccounts(); List <InstanceDetail> profilelist = new List <InstanceDetail>(); //foreach (var profile_ in profile) //{ // Amazon.Util.ProfileManager.RegisterProfile(profile_.ProfileName, profile_.Accesskey, profile_.Secretkey); //} try { foreach (var profile_ in profile) { var regions = Amazon.RegionEndpoint.EnumerableAllRegions; //Amazon.Runtime.AWSCredentials credentials = new Amazon.Runtime.StoredProfileAWSCredentials(profile_.ProfileName); foreach (var r in regions) { string region_; if (r.SystemName != "us-gov-west-1" && r.SystemName != "cn-north-1") { region_ = r.SystemName; var region = RegionEndpoint.GetBySystemName(region_); AmazonEC2Client ec2 = new AmazonEC2Client(profile_.Accesskey, profile_.Secretkey, region); DescribeInstancesRequest request = new DescribeInstancesRequest(); DescribeInstancesResponse response = ec2.DescribeInstances(request); DescribeVolumesRequest volumeRequest = new DescribeVolumesRequest(); DescribeVolumesResponse volumeResponse = ec2.DescribeVolumes(volumeRequest); int size = 0; foreach (var volume in volumeResponse.Volumes) { size += volume.Size; } List <Reservation> result = response.Reservations; foreach (var item in result) { List <Instance> results = item.Instances; foreach (var instance in results) { InstanceDetail p = new InstanceDetail(); p.InstanceId = instance.InstanceId.ToString(); DescribeInstanceStatusRequest req = new DescribeInstanceStatusRequest(); req.InstanceIds.Add(p.InstanceId); DescribeInstanceStatusResponse resp = ec2.DescribeInstanceStatus(req); var statuses = resp.InstanceStatuses; foreach (var status in statuses) { p.InstanceState = status.Status.Status; } if (p.InstanceState == null) { p.InstanceState = "Not Available"; } p.Region = r.SystemName; p.DiskSize = (size / result.Count).ToString() + " GB"; // if (instance.PublicIpAddress != null) { p.IpAddress = instance.PublicIpAddress; } else { p.IpAddress = "Not Assigned"; } p.ProfileName = profile_.ProfileName; p.InstanceType = instance.InstanceType; p.Status = instance.State.Name.Value; p.ResourceGroup = "Not Applicable"; if (instance.IamInstanceProfile != null) { p.MachineName = instance.IamInstanceProfile.Arn; } else { p.MachineName = "Not Assigned"; } p.accountId = profile_.accountId; var type = instance.InstanceType; p.Type = "virtualMachines"; var b = instance.Tags.Count; if (b != 0) { p.MachineName = instance.Tags[0].Value; } if (instance.Platform != null) { p.OSType = instance.Platform; } else { p.OSType = "Amazon Linux"; } profilelist.Add(p); } } } } } return(profilelist); } catch (Exception e) { this.log.Error(e); return(null); } }
public static DescribeVolumesResponse Unmarshall(UnmarshallerContext context) { DescribeVolumesResponse describeVolumesResponse = new DescribeVolumesResponse(); describeVolumesResponse.HttpResponse = context.HttpResponse; describeVolumesResponse.RequestId = context.StringValue("DescribeVolumes.RequestId"); describeVolumesResponse.TotalCount = context.IntegerValue("DescribeVolumes.TotalCount"); describeVolumesResponse.PageNumber = context.IntegerValue("DescribeVolumes.PageNumber"); describeVolumesResponse.PageSize = context.IntegerValue("DescribeVolumes.PageSize"); List <DescribeVolumesResponse.DescribeVolumes_Volume> describeVolumesResponse_volumes = new List <DescribeVolumesResponse.DescribeVolumes_Volume>(); for (int i = 0; i < context.Length("DescribeVolumes.Volumes.Length"); i++) { DescribeVolumesResponse.DescribeVolumes_Volume volume = new DescribeVolumesResponse.DescribeVolumes_Volume(); volume.VolumeId = context.StringValue("DescribeVolumes.Volumes[" + i + "].VolumeId"); volume.RegionId = context.StringValue("DescribeVolumes.Volumes[" + i + "].RegionId"); volume.ZoneId = context.StringValue("DescribeVolumes.Volumes[" + i + "].ZoneId"); volume.VolumeName = context.StringValue("DescribeVolumes.Volumes[" + i + "].VolumeName"); volume.Description = context.StringValue("DescribeVolumes.Volumes[" + i + "].Description"); volume.Category = context.StringValue("DescribeVolumes.Volumes[" + i + "].Category"); volume.Size = context.IntegerValue("DescribeVolumes.Volumes[" + i + "].Size"); volume.SourceSnapshotId = context.StringValue("DescribeVolumes.Volumes[" + i + "].SourceSnapshotId"); volume.AutoSnapshotPolicyId = context.StringValue("DescribeVolumes.Volumes[" + i + "].AutoSnapshotPolicyId"); volume.SnapshotLinkId = context.StringValue("DescribeVolumes.Volumes[" + i + "].SnapshotLinkId"); volume.Status = context.StringValue("DescribeVolumes.Volumes[" + i + "].Status"); volume.EnableAutomatedSnapshotPolicy = context.BooleanValue("DescribeVolumes.Volumes[" + i + "].EnableAutomatedSnapshotPolicy"); volume.CreationTime = context.StringValue("DescribeVolumes.Volumes[" + i + "].CreationTime"); volume.VolumeChargeType = context.StringValue("DescribeVolumes.Volumes[" + i + "].VolumeChargeType"); volume.MountInstanceNum = context.IntegerValue("DescribeVolumes.Volumes[" + i + "].MountInstanceNum"); volume.Encrypted = context.BooleanValue("DescribeVolumes.Volumes[" + i + "].Encrypted"); List <DescribeVolumesResponse.DescribeVolumes_Volume.DescribeVolumes_OperationLock> volume_operationLocks = new List <DescribeVolumesResponse.DescribeVolumes_Volume.DescribeVolumes_OperationLock>(); for (int j = 0; j < context.Length("DescribeVolumes.Volumes[" + i + "].OperationLocks.Length"); j++) { DescribeVolumesResponse.DescribeVolumes_Volume.DescribeVolumes_OperationLock operationLock = new DescribeVolumesResponse.DescribeVolumes_Volume.DescribeVolumes_OperationLock(); operationLock.LockReason = context.StringValue("DescribeVolumes.Volumes[" + i + "].OperationLocks[" + j + "].LockReason"); volume_operationLocks.Add(operationLock); } volume.OperationLocks = volume_operationLocks; List <DescribeVolumesResponse.DescribeVolumes_Volume.DescribeVolumes_MountInstance> volume_mountInstances = new List <DescribeVolumesResponse.DescribeVolumes_Volume.DescribeVolumes_MountInstance>(); for (int j = 0; j < context.Length("DescribeVolumes.Volumes[" + i + "].MountInstances.Length"); j++) { DescribeVolumesResponse.DescribeVolumes_Volume.DescribeVolumes_MountInstance mountInstance = new DescribeVolumesResponse.DescribeVolumes_Volume.DescribeVolumes_MountInstance(); mountInstance.InstanceId = context.StringValue("DescribeVolumes.Volumes[" + i + "].MountInstances[" + j + "].InstanceId"); mountInstance.Device = context.StringValue("DescribeVolumes.Volumes[" + i + "].MountInstances[" + j + "].Device"); mountInstance.AttachedTime = context.StringValue("DescribeVolumes.Volumes[" + i + "].MountInstances[" + j + "].AttachedTime"); volume_mountInstances.Add(mountInstance); } volume.MountInstances = volume_mountInstances; List <DescribeVolumesResponse.DescribeVolumes_Volume.DescribeVolumes_Tag> volume_tags = new List <DescribeVolumesResponse.DescribeVolumes_Volume.DescribeVolumes_Tag>(); for (int j = 0; j < context.Length("DescribeVolumes.Volumes[" + i + "].Tags.Length"); j++) { DescribeVolumesResponse.DescribeVolumes_Volume.DescribeVolumes_Tag tag = new DescribeVolumesResponse.DescribeVolumes_Volume.DescribeVolumes_Tag(); tag.TagKey = context.StringValue("DescribeVolumes.Volumes[" + i + "].Tags[" + j + "].TagKey"); tag.TagValue = context.StringValue("DescribeVolumes.Volumes[" + i + "].Tags[" + j + "].TagValue"); volume_tags.Add(tag); } volume.Tags = volume_tags; describeVolumesResponse_volumes.Add(volume); } describeVolumesResponse.Volumes = describeVolumesResponse_volumes; return(describeVolumesResponse); }
/// <summary> /// Check for any volumes that have a snapshot scheduled based on the schedule in the snapshotSchedule tag key. /// </summary> public static void CheckForScheduledSnapshots() { Console.WriteLine("Checking for scheduled snapshots..."); AmazonEC2 ec2 = Ec2Helper.CreateClient(); DescribeVolumesRequest rq = new DescribeVolumesRequest(); rq.WithFilter(new Filter() { Name = "tag-key", Value = new List <string>() { "snapshotSchedule" } }); DescribeVolumesResponse rs = ec2.DescribeVolumes(rq); foreach (Volume v in rs.DescribeVolumesResult.Volume) { string[] sch2 = Ec2Helper.GetTagValue(v.Tag, "snapshotSchedule").Split(' '); string volumename = Ec2Helper.GetTagValue(v.Tag, "Name"); DateTime lastSnap; // date of last snapshot DateTime nextSnap; // the next backup that should have occured based on last backup DateTime nextNextSnap; // the next backup that should occur assuming a backup runs now or ran at the last proper time DateTime now = DateTime.UtcNow; if (!DateTime.TryParse(Ec2Helper.GetTagValue(v.Tag, "lastSnapshot"), out lastSnap)) { lastSnap = Convert.ToDateTime("1/1/2010"); } Console.WriteLine("Checking " + v.VolumeId + " / " + volumename + "..."); //sch2 = ("hourly 4 :30 x30days").Split(' '); //lastSnap = Convert.ToDateTime("2/29/2012 6:00:15pm"); //now = Convert.ToDateTime("2/29/2012 10:00:14pm"); switch (sch2[0]) { case "hourly": // hourly, hourly 1 :15, hourly :30, hourly 4 (pass it hours between backups & when on the hour to do it, any order; defaults to every hour on the hour) int ah = GetAfterTheHour(sch2, 0); int hi = GetInt(sch2, 1); nextSnap = lastSnap.AddMinutes(-lastSnap.Minute).AddSeconds(-lastSnap.Second).AddMilliseconds(-lastSnap.Millisecond); nextSnap = nextSnap.AddHours(hi).AddMinutes(ah); // this is not right nextNextSnap = now.AddMinutes(-now.Minute).AddSeconds(-now.Second).AddMilliseconds(-now.Millisecond); nextNextSnap = nextNextSnap.AddMinutes(ah).AddHours(hi); break; case "daily": // daily, 3pm, daily 15:15, daily 3:30pm (times are UTC; defaults to midnight UTC) DateTime hour = GetTime(sch2, Convert.ToDateTime("0:00")); nextSnap = lastSnap.Date.AddDays(1).AddTicks(hour.TimeOfDay.Ticks); nextNextSnap = now.Date.AddDays(1).AddTicks(hour.TimeOfDay.Ticks); break; case "weekly": // weekly, weekly sunday, weekly thursday 3pm (times are UTC; defaults to sunday midnight UTC) DateTime whour = GetTime(sch2, Convert.ToDateTime("0:00")); DayOfWeek dow = GetDow(sch2, DayOfWeek.Sunday); if (lastSnap.DayOfWeek >= dow) { nextSnap = lastSnap.Date.AddDays(-(int)lastSnap.DayOfWeek).AddDays(7 + (int)dow).AddTicks(whour.TimeOfDay.Ticks); } else { nextSnap = lastSnap.Date.AddDays(-(int)lastSnap.DayOfWeek).AddDays((int)dow).AddTicks(whour.TimeOfDay.Ticks); } nextNextSnap = now.Date.AddDays(-(int)now.DayOfWeek).AddDays(7 + (int)dow).AddTicks(whour.TimeOfDay.Ticks); if (nextSnap == nextNextSnap) { nextNextSnap = nextNextSnap.AddDays(7); } break; default: lastSnap = now.AddYears(1); nextSnap = lastSnap; nextNextSnap = lastSnap; break; } //Console.WriteLine("last=" + lastSnap.ToString()); //Console.WriteLine("now=" + now); //Console.WriteLine("next=" + nextSnap.ToString()); //Console.WriteLine("nextNext=" + nextNextSnap.ToString()); //Console.ReadKey(); //return; if (nextSnap <= now) { // create snapshot of volume string expires = ""; int expireHours = GetExpireHours(sch2, 0); if (expireHours > 0) { expires = now.AddHours(expireHours).ToString(); } Backup(volumename, "automatic", v.VolumeId, volumename, Ec2Helper.GetInstanceName(v.Attachment[0].InstanceId), expires); // update volume tags CreateTagsRequest rqq = new CreateTagsRequest(); rqq.WithResourceId(v.VolumeId); nextSnap = nextSnap.AddSeconds(-nextSnap.Second).AddMilliseconds(-nextSnap.Millisecond); rqq.WithTag(new Tag[] { new Tag { Key = "lastSnapshot", Value = now.ToString() }, new Tag { Key = "nextSnapshot", Value = nextNextSnap.ToString() } }); var createTagResponse = ec2.CreateTags(rqq); } else { Console.WriteLine(" Next scheduled " + nextSnap.ToString()); } } }
void MonitorFunction() { Thread.CurrentThread.Name = "MonitorThread"; Program.TraceLine("Monitoring thread started..."); Program.MonitorMessage = "Monitor starting..."; while (true) { try { //TEST ZONE { } //Now continues normally lock (Ec2Lock) { if (!RunMonitoring) { return; } } DescribeInstancesResponse respEc2 = GetRunningInstances(); UpdateClassOfObjects(currentStatusEc2, respEc2.DescribeInstancesResult.Reservation); Program.MonitorMessage = "Updated EC2s..."; foreach (ZAwsEc2 ec2Instance in CurrentEc2s) { lock (Ec2Lock) { if (!RunMonitoring) { return; } } ec2Instance.UpdateInfo(); Program.MonitorMessage = "Updated EC2 " + ec2Instance.Name; } lock (Ec2Lock) { if (!RunMonitoring) { return; } } DescribeAddressesResponse respElasitIp = GetElasticIps(); UpdateClassOfObjects(currentStatusElIps, respElasitIp.DescribeAddressesResult.Address); Program.MonitorMessage = "Updated elastic IPs"; lock (Ec2Lock) { if (!RunMonitoring) { return; } } ListHostedZonesResponse route53Zones = GetHostedZones(); UpdateClassOfObjects(currentHostedZones, route53Zones.ListHostedZonesResult.HostedZones); Program.MonitorMessage = "Updated hosted zones..."; foreach (ZAwsHostedZone zone in CurrentHostedZones) { lock (Ec2Lock) { if (!RunMonitoring) { return; } } zone.UpdateInfo(); Program.MonitorMessage = "Updated zone " + zone.Name; } /* * We will not be checking S3 service, because that actually costs money! * lock (Ec2Lock) { if (!RunMonitoring) { return; } } * ListBucketsResponse s3Buckects = GetBuckets(); * UpdateClassOfObjects(currentS3Buckets, s3Buckects.Buckets); * Program.MonitorMessage = "Updated S3 Buckets..."; * */ lock (Ec2Lock) { if (!RunMonitoring) { return; } } DescribeSnapshotsResponse respEc2Snapshots = GetSnapshots(); UpdateClassOfObjects(currentSnapshots, respEc2Snapshots.DescribeSnapshotsResult.Snapshot); Program.MonitorMessage = "Updated EC2 Snapshots..."; lock (Ec2Lock) { if (!RunMonitoring) { return; } } DescribeKeyPairsResponse respKeyPairs = GetKeyPairs(); UpdateClassOfObjects(currentKeyPairs, respKeyPairs.DescribeKeyPairsResult.KeyPair); Program.MonitorMessage = "Updated KeyPairs..."; lock (Ec2Lock) { if (!RunMonitoring) { return; } } DescribeSecurityGroupsResponse respSecGroups = GetSecurityGroups(); UpdateClassOfObjects(currentSecGroups, respSecGroups.DescribeSecurityGroupsResult.SecurityGroup); Program.MonitorMessage = "Updated Sec Groups..."; lock (Ec2Lock) { if (!RunMonitoring) { return; } } DescribeImagesResponse respAmis = GetAmis(); UpdateClassOfObjects(currentAmis, respAmis.DescribeImagesResult.Image); Program.MonitorMessage = "Updated AMIs..."; lock (Ec2Lock) { if (!RunMonitoring) { return; } } DescribeVolumesResponse respEbsVolumes = GetEbsVolumes(); UpdateClassOfObjects(currentEbsVolumes, respEbsVolumes.DescribeVolumesResult.Volume); Program.MonitorMessage = "Updated EBS volumes..."; lock (Ec2Lock) { if (!RunMonitoring) { return; } } DescribeSpotInstanceRequestsResponse respSpotRequests = GetSpotRequests(); UpdateClassOfObjects(currentSpotRequests, respSpotRequests.DescribeSpotInstanceRequestsResult.SpotInstanceRequest); Program.MonitorMessage = "Updated spot requests..."; lock (Ec2Lock) { if (!RunMonitoring) { return; } } if (ThreadInRecovery) { Program.TraceLine("Monitoring working fine again..."); ThreadInRecovery = false; } } catch (Exception ex) { Program.TraceLine("Monitoring thread encountered an error. Will restart in {0}...", ex, ThreadInRecovery ? "1 minute" : "5 seconds"); Program.MonitorMessage = "Monitor paused..."; for (int i = 0; i < (ThreadInRecovery ? 600 : 50); i++) { lock (Ec2Lock) { if (!RunMonitoring) { return; } } Thread.Sleep(100); } Program.TraceLine("Monitoring thread trying to recover..."); Program.MonitorMessage = "Monitor restarting..."; ThreadInRecovery = true; } finally { if (!RunMonitoring) { Program.MonitorMessage = "Monitor stopped."; } } } }