Тестирование результатов интеграции
На этапе исполнения сервер IIS слушает порт 80. В программе есть несколько контроллеров, которые обрабатывают запросы, отправленные клиентским приложением. В процессе интеграции библиотеки в проект компании был создан VdsController, в котором были реализованы методы обработки запросов, подразумевающих взаимодействие с развёрнутой в описанном ранее кластере облачной инфраструктурой. После того, как пользователь прошёл процедуру регистрации в системе vds.ultrazoom.ru, он получает доступ к панели управления выделенными ему ресурсами. Создание пользователя непосредственно внутри системы облачной инфраструктуры происходит перед созданием первого виртуального сервера.
Таблица 8. Аппаратная реализация узлов
Узел | Аппаратная реализация |
Контроллер | Модель: Dell R620 ЦПУ: 2x Intel® Xeon® CPU E5-2620 0 @ 2.00 GHz Оперативная память: 32 ГБ Диск: два 300 ГБ 10000 RPM SAS диска Сеть: два сетевых порта 10G |
Вычислительный узел | Model: Dell R620 ЦПУ: 2x Intel® Xeon® CPU E5-2650 0 @ 2.00 GHz Оперативная память: 128 GB Диск: два 600 GB 10000 RPM SAS диска Сеть: четыре сетевых порта 10G |
Узел хранения | Модель: Dell R720xd ЦПУ: 2x Intel® Xeon® CPU E5-2620 0 @ 2.00 GHz Оперативная память: 64 ГБ Диск: два диска 500 ГБ 7200 RPM SAS и двадцать четыре диска 600 ГБ 10000 RPM SAS Disks Raid контроллер: PERC H710P интегрированный RAID контроллер, 1 ГБ NV кеш Сеть: два сетевых порта 10G |
Для тестирования работы и результатов интегрирования библиотеки, была создана тестовая учётная запись на портале vds.ultrazoom.ru. В разделеWeb-интерфейса сайта, отображающего средства создания новой виртуальной машины была выбрана тестовая конфигурация сервера под управлением операционной системы Windows Server 2008 и запущен процесс создания виртуальной машины. В результате соответствующий метод серверного приложения выполнил следующие действия:
1) Инстаниировал классы RegistrationQuery и AuthorizationQuery разработанной библиотеки OpenstackManager для выполнения операции создания пользователя облачной платформы. В качестве учётных данных были использованы логин и пароль, предоставленные на этапе регистрации на портале vds.ultrazoom.ru и хранящиеся в базе данных системы.
2) Выполнил задачу регистрации и авторизации пользователя в облаке средствами классов RegistrationQuery и AuthorizationQuery соответственно.
3) На основе выбранной конфигурации получил имена шаблона виртуальной конфигурации и образа виртуального сервера в соответствии с правилами именования данных элементов системы, установленными системными администраторами проекта и описанными в конфигурационном файле серверного приложения.
4) Инстанциировал класс CreateServerQuery, передав в конструктор токен, полученный на втором шаге и данные, полученные на третьем шаге. Инициализировал задачу по созданию виртуального сервера средствами класса CreateServerQuery.
5) Обработал данные, полученные в ответ на запрос выполнения функции OpenStackAPI, инициализирующей задачу создания нового виртуального сервера. Обновил необходимые данные о, доступных пользователю, экземплярах виртуальных серверов, которые хранятся в базе данных системы.
6) Отправил клиентскому приложению все необходимые данные для обновления Web-интерфейса пользователя.
На рисунке 9 показан пользовательский интерфейс портала vds.ultrazoom.ru, предоставляющий информацию о созданном виртуальном сервере.
Рисунок 10. Интерфейс пользователя vds.ultrzoom.ru
Вывод
На этапе интеграции классы разработанной ранее библиотеки были успешно использованы в серверном приложении портала самообслуживания vds.ultrazoom.ru для решения задач по управлению ресурсами облка, развёрнутого средствами OpenStack на серверах компании UltraZoom.
Заключение
В результате работы была получена библиотека классов .NET, содержащая функционал по управлению ресурсами облачной инфраструктуры. На этапе реализации данной библиотеки были выполнены следующие последовательные действия:
· Спроектирована архитектура библиотеки классов
· Реализованы базовые классы и интерфейсы архитектуры
· Реализованы классы базовых команд
· Реализованы классы сценариев
В ходе проведенной работы были выполнены все поставленные в дипломе цели и задачи, т.е. полученная библиотека удовлетворяет следующим функциональным требованиям:
· Содержит средства создания нового пользователя облачной платформы, поддерживающие установку ролей, определяющих конкретные правила и полномочия пользователя.
· Содержит средства аутентификации, необходимые для взаимодействия пользователя с облачной платформой.
· Содержит функционал, позволяющий пользователю создавать новые виртуальные сервера и управлять существующими.
· Содержит функционал, необходимый для создания и управления резервными копиями виртуальных серверов пользователя.
Список используемой литературы
1. Технология облачных вычислений [Электронный ресурс]
http://mirtelecoma.ru/magazine/elektronnaya-versiya/31/
2. Что такое инфраструктура как услуга [Электронный ресурс]
https://technet.microsoft.com/ru-ru/cloud/hh744751.aspx
3. Маркелов, А. А. OpenStack. Знакомство с облачной операционной системой/ А. А. Маркелов –ДМК Пресс, 2016 г. – 160 с.
4. Внедрение OpenStack и куда двигаться дальше? [Электронный ресурс] https://habrahabr.ru/company/icl_services/blog/281068/
5. Знакомство с OpenStack : архитектура, функции, взаимодействия [Электронный ресурс] http://www.ibm.com/developerworks/ru/library/cl-openstack-overview/index.html
6. OpenStack API Complete Reference [Электронныйресурс]
http://developer.openstack.org/api-ref.html
7. РихетД. CLR via C#. Программирование на платформе Microsoft .NET Framework 4.0 на языке C# /Д.Рихтер–Питер, 2012 г. – 928 с.
8. Общие сведения о платформе .NET Framework [Электронный ресурс]
https://msdn.microsoft.com/ru-ru/library/zw4w595w(v=vs.110).aspx
9. ШилдтГ. C# 4.0. Полное руководство / Г. Шилдт –Вильямс, 2015 г. – 1056 с.
10. Гамма Э. Приёмы объектно-ориентированного проектирования. Паттерны проектирования / Э.Гамма, Р.Хелм, Р. Джонсон, Дж.Влиссидес –Питер, 2013 г. – 386 с.
11. Р. С. Мартин Принципы, паттерны и методики гибкой разработки на языке C# / Р. С. Мартин, М. Мартин. –Символ-Плюс, 2011 г. – 768 с.
12. Знакомство с OpenStack : Компонент Identity (Keystone) [Электронный ресурс]
http://www.ibm.com/developerworks/ru/library/cl-openstack-keystone/index.html
13. Знакомство с OpenStack: компонент Glance и компонент Nova [Электронный ресурс]
http://www.ibm.com/developerworks/ru/library/cl-openstack-nova-glance/index.html/
ПРИЛОЖЕНИЕ А
Листинг 1
public interface ICommand
{
void Execute();
}
public interface IQuery<T>
{
T Execute();
}
Листинг 3
public abstract class CommandBase : ICommand
{
public void Execute()
{
var webClient = new WebClient();
var httpParams = GetHttpRequestParams();
webClient.Headers.Add(HttpRequestHeader.ContentType, httpParams.ContentType);
if (string.IsNullOrEmpty(httpParams.XAuthToken))
webClient.Headers.Set("X-Auth-Token", httpParams.XAuthToken);
webClient.UploadString(httpParams.Url, httpParams.Method, httpParams.MessageBody);
}
abstract protected HttpRequestParams GetHttpRequestParams();
}
public abstract class QueryBase<T> : IQuery<T>
{
public void Execute()
{
var webClient = new WebClient();
var httpParams = GetHttpRequestParams();
webClient.Headers.Add(HttpRequestHeader.ContentType, httpParams.ContentType);
if (string.IsNullOrEmpty(httpParams.XAuthToken))
webClient.Headers.Set("X-Auth-Token", httpParams.XAuthToken);
var result = webClient.UploadString(httpParams.Url, httpParams.Method, httpParams.MessageBody);
return JsonConvert.DeserializeObject<T>(result);
}
abstract protected HttpRequestParams GetHttpRequestParams();
}
Листинг 4
public class CreateUserResponse
{
public string id {get; set;}
public string name {get; set;}
public string domain_id {get; set;}
public string enabled {get; set;}
}
public class CreateUserQuery : QueryBase<CreateUserCommand>
{
private string _url;
private string _name;
private string _password;
private string _domainUuid;
public CreateUserQuery(string url,
string name, string password, string domainUuid)
{
_xAuthToken = xAuthToken;
_name = name;
_password = password;
_url = url;
_domainUuid = domainUuid;
}
protected override HttpRequestParams GetHttpRequestParams()
{
var url = _url + "v3/";
var messageBodyObj = new
{
auth = new
{
identity = new
{
methods = new[] { "password" },
password = new
{
user = new
{
domain_id = _domainUuid,
name = _name,
password = _password
}
}
},
}
};
var method = "POST";
var contentType = "application/json";
var messageBody = JsonConvert.SerializeObject(messageBodyObj);
return new HttpRequestParams
{
Url = url,
ContentType = contentType,
MessageBody = messageBody,
Method = method,
};
}
}
Листинг 5
public class CreateServerResponse
{
public string id {get; set;}
public DateTime created {get; set;}
public string name {get; set;}
public string accessIPv4 {get; set;}
public string accessIPv6 {get; set;}
public string vm_state {get; set;}
public string user_Id {get; set;}
}
public class CreateServerQuery : QueryBase<CreateServerResponse>
{
private string _flavorRef;
private string _imageRef;
private string _name;
private string _adminPass;
private string _xAuthToken;
private string _baseUrl;
public CreateServerQuery(string flavorRef, string imageRef, string name,
string adminPass, string xAuthToken, string baseUrl)
{
_flavorRef = flavorRef;
_imageRef = imageRef;
_name = name;
_adminPass = adminPass;
_xAuthToken = xAuthToken;
_baseUrl = baseUrl;
}
protected override HttpRequestParams GetHttpRequestParams()
{
var url = _baseUrl + "v3/";
var messageBodyObj = new
{
server = new
{
name = _name,
imageRef = _imageRef,
flavorRef = _flavorRef,
adminPass = _adminPass
}
};
var method = "POST";
var contentType = "application/json";
var messageBody = JsonConvert.SerializeObject(messageBodyObj);
return new HttpRequestParams
{
Url = url,
ContentType = contentType,
MessageBody = messageBody,
Method = method,
XAuthToken = _xAuthToken
};
}
}
Листинг 6
public class CreateServerQuery: IQuery<CreateServerResponse>
{
private string _xAuthToken;
private string _baseUrl;
private string _flavorName;
private string _imageName;
private string _serverName;
private string _adminUrl;
private string _adminPass;
public CreateServerByNamesCommand(string xAuthToken, string baseUrl, string adminUrl, string flavorName, string imageName, string serverName, string adminPass)
{
_xAuthToken = xAuthToken;
_baseUrl = baseUrl;
_flavorName = flavorName;
_imageName = imageName;
_serverName = serverName;
_adminUrl = adminUrl;
_adminPass = adminPass;
}
public CreateServerResponse Execute()
{
var getFlavorsQuery = new GetFlavorQuery(_adminUrl);
var flavorsList = getFlavorsQuery.Execute();
var flavor = flavorsList.FirstOrDefault(f => f.name == _flavorName);
if (flavor == null)
return;
var flavorId = flavor.id;
var getImagesQuery = new GetImagesQuery(_adminUrl);
var imagesList = getImagesQuery.Execute();
var image = flavorsList.FirstOrDefault(i => i.name == _imageName);
if (image == null)
return;
var imageId = image.id;
var createServerQuery = new CreateServerQuery(flavorId, imageId, _serverName, _adminPass, _xAuthToken, _baseUrl);
return createServerQuery.Execute();
}
}