//Create the view for the Backups screen public ActionResult Backups() { //Set user credentials as session variables string username = Session["SkyscapeUsername"] as string; string password = Session["SkyscapePassword"] as string; //Initializes a new api call to Skyscape var api = new APIMethods(); //Authentication details passed through from config class var authenticate = api.authenticateSkyscape(username, password); var accounts = api.getAccounts(); //Generates viewModels for view VmViewModel vmViewModel = new VmViewModel(); vmViewModel.names = new List<string>(); vmViewModel.accountVms = new List<PanelVM>(); vmViewModel.accounts = new List<Account>(); vmViewModel.backups = new List<Backup>(); // "expires_after : 900" means a successful authentication if (authenticate.Content == "{\"expires_after\":900}") { //Generates counter to uniquely identify JQuery dialogs in Backup view int k = 0; ViewBag.response = "Authentication successful"; //Deserializes JSON string into account objects vmViewModel.accounts = JsonConvert.DeserializeObject<List<Account>>(accounts.Content); //Loop through deserialized accounts for (int i = 0; i < vmViewModel.accounts.Count; i++) { //getVms makes the call to Skyscape to retrieve vm/backup information var vms = api.getSkyscapeVms(vmViewModel.accounts[i].id); //result is the objects of the returned deserialized JSON String from the API with a set DateTimeFormat included var result = JsonConvert.DeserializeObject<SkyscapeResponse>(vms.Content, new IsoDateTimeConverter { DateTimeFormat = "dd/MM/yyyy HH:mm" }); //To create VM objects, must loop through the different levels of JSON String foreach (var vOrg in result.vOrgs) { foreach (var vDC in vOrg.vDCs) { foreach (var vApp in vDC.vApps) { foreach (var virtualMachine in vApp.VMs) { //If any VM within an account has at a last backup which failed, count this fail to display in accordion view if (virtualMachine.LastBackupStatus.Contains("Failed")) { vmViewModel.accounts[i].allBackupsStatus = false; vmViewModel.accounts[i].numberFailedBackups++; } //create new instance of PanelVM PanelVM panelVm = new PanelVM(); { panelVm.AccountId = result.Account.id; panelVm.Name = virtualMachine.Name; panelVm.LastBackupStatus = virtualMachine.LastBackupStatus; panelVm.LastBackup = virtualMachine.LastBackup; panelVm.backups = virtualMachine.Backups; panelVm.Id = virtualMachine.Id; //Not suitable as unique identifier for VM as may be duplicate in other accounts panelVm.Size = virtualMachine.Size; panelVm.MonthToDate = virtualMachine.MonthToDate; panelVm.EstimatedMonthlyTotal = virtualMachine.EstimatedMonthlyTotal; panelVm.BilledHoursPoweredOn = virtualMachine.BilledHoursPoweredOn; panelVm.BilledHoursPoweredOff = virtualMachine.BilledHoursPoweredOff; panelVm.PowerStatus = virtualMachine.PowerStatus; panelVm.OperatingSystem = virtualMachine.OperatingSystem; panelVm.NumberOfCPUs = virtualMachine.NumberOfCPUs; panelVm.Memory = virtualMachine.Memory; panelVm.Storage = virtualMachine.Storage; panelVm.counter = k++; //counter allows unique ID of VM without using any Skyscape data as key for VM } //Must add panelVm to view model in order to use in Backups view vmViewModel.accountVms.Add(panelVm); } } } } } } else //API Authentication has failed { ViewBag.response = "Authentication Failed"; return RedirectToAction("Login", "Home"); } return View(vmViewModel); // Must return viewModel to create view }
//Runs when snapshots page is opened public ActionResult Snapshots() { string username = Session["SkyscapeUsername"] as string; string password = Session["SkyscapePassword"] as string; var api = new APIMethods(); //Authentication details passed through from config class var authenticate = api.authenticateSkyscape(username, password); var accounts = api.getAccounts(); SnapshotViewModel snapshotViewModel = new SnapshotViewModel(); snapshotViewModel.skyscapeAccounts = new List<Account>(); snapshotViewModel.Vms = new List<QueryResultRecords>(); snapshotViewModel.vCloudAccounts = new Dictionary<int, Account>(); int vmId = 0; //Deserializes JSON string into account objects snapshotViewModel.skyscapeAccounts = JsonConvert.DeserializeObject<List<Account>>(accounts.Content); //Loop through deserialized accounts foreach (Account account in snapshotViewModel.skyscapeAccounts) { Account vCloudAccount = new Account(); { vCloudAccount.vCloudCredentials = new List<Dictionary<string, vCloudIdentifiers>>(); vCloudAccount.vCloudToken = new Dictionary<string, int>(); var vCloudCredentialObject = (JsonConvert.DeserializeObject<Dictionary<string, vCloudIdentifiers>>(api.getVCloudCreds(account.id).Content)); vCloudAccount.id = account.id; vCloudAccount.vCloudCredentials.Add(vCloudCredentialObject); foreach (var vCloudCredential in vCloudAccount.vCloudCredentials) { foreach (var key in vCloudCredential.Keys) { if (key.Contains("-" + account.id.ToString() + "-")) { byte[] credentialsAsBytes = System.Text.Encoding.ASCII.GetBytes(vCloudCredential[key].username.ToString() + ":" + password); string encodedCredentials = Convert.ToBase64String(credentialsAsBytes); string token = api.authenticateVCloud(encodedCredentials); if (token != null) { vCloudAccount.vCloudToken.Add(token, account.id); } else { //Variable used to show non authenticated accounts in snapshot view account.hasAccess = false; } } } } } //Match the account id and the vcloud account in the dictionary snapshotViewModel.vCloudAccounts.Add(account.id, vCloudAccount); } foreach (var vCloudAccount in snapshotViewModel.vCloudAccounts.Values) { foreach (string vCloudToken in vCloudAccount.vCloudToken.Keys) { //pass vCloudToken into API call to get VMs var vmsXml = api.getVCloudVms(vCloudToken).GetResponseStream(); //To create snapshot objects, must loop through the different levels of XML using a streamreader var vmSerializer = new XmlSerializer(typeof(QueryResultRecords)); using (var vmStreamReader = new StreamReader(vmsXml)) { //Deserialize XML into VMs QueryResultRecords Vms = (QueryResultRecords)vmSerializer.Deserialize(vmStreamReader); Vms.vCloudId = vCloudAccount.id; snapshotViewModel.Vms.Add(Vms); foreach (var vm in Vms.VMRecord) { if (vm.CatalogName == null) { //if no catalog name for VM var snapshotXml = api.getVCloudVmsSnapshots(vm.Href, vCloudToken).GetResponseStream(); var snapshotSerializer = new XmlSerializer(typeof(SnapshotSection)); using (var snapshotStreamReader = new StreamReader(snapshotXml)) { SnapshotSection snapshot = (SnapshotSection)snapshotSerializer.Deserialize(snapshotStreamReader); if (snapshot.Snapshot != null) { //set up snapshot object if snapshot exists vm.unofficialId = vmId; vmId++; vm.Snapshot = snapshot; vm.Snapshot.Snapshot.SizeInGB = long.Parse(vm.Snapshot.Snapshot.Size) / 1073741824; vm.Snapshot.Snapshot.accountId = vCloudAccount.vCloudToken[vCloudToken]; if (vm.Snapshot.Snapshot.Created.AddDays(3) < DateTime.Now.Date) //check if snapshot is older than 3 days { foreach (var account in snapshotViewModel.skyscapeAccounts) { if (account.id == vCloudAccount.id) { //add 1 to count of old snapshots for this account account.numberOldSnapshots++; } } } } } } } } } } return View(snapshotViewModel); }