VMware vSphere Web Service SDK là bô ̣ công cu ̣ cung cấp khả năng quản trị thông qua các giao diện lập trình . Bô ̣ công cu ̣ này hoa ̣t đô ̣ng cả trên vCenter Server và các ESXi/ESX, chúng bao gồm các vSphere API cho các ngôn ngữ lâ ̣p trình như C#, Java và Perl.
vSphere API được xây dựng dựa trên nền Web Service , bằng cách cung cấp môt cơ chế go ̣i hàm từ xa , cho phép các máy tra ̣m có thể truy xuất các di ̣ch vu ̣ hoă ̣c các thành phần trên ESXi/ESX và vCenter Server . Mô hình giao tiếp giữa các thành phần từ phía máy trạm tới máy chủ thông qua cơ chế bất đồng bộ.
Hình 4.8 – Mô hình giao tiếp thông qua giao diê ̣n quản tri ̣ trên hê ̣ thống vSphere29
Kiến trúc này dựa trên các đối tƣợng đƣợc quản trị ở phía máy chủ
(server-side managed components), các đối tƣợng tham chiếu tƣ̀ phía máy trạm (client-site managed object references ) và các đối tƣợng mang dữ liệu
(data objects):
Các đối tượng được quản trị ở phía máy chủ (managed objects): các đối tượng này nằm trên hê ̣ thống ảo hóa vSphere (ESXi/ESX và vCenter Server ), chúng đại diện cho các dịch vụ và các thành phần ở phía máy chủ. Các dịch vụ ở đây gồm có : PropertyCollector, PerformanceManager và ViewManager . Các thành phần bao gồm các đối tượng nằm trên máy chủ như VirtualMachine , Datastore và Folder.
Các đối tượng tham chiếu từ máy trạm : là các đối tượng , hoă ̣c ứng du ̣ng từ phía máy trạm tham chiếu tới đối tượng được quản trị ở phía máy chủ . Ứng dụng ở phía máy trạm sử dụng đối tượng ManagedObjectReference khi nó muốn
gọi hàm thực thi cách hoạt động ở phía máy chủ . Mô ̣t ManagedObjectReference được đảm bảo là duy nhất và tồn ta ̣i bền vững trong cả vòng đời của đối tượng.
Các đối tượng mang dữ liệu (data objects): đối tượng chứa thông tin về đối tượng được máy chủ quản lý . Ứng dụng ở phía máy trạm gửi đối tượng mang dữ liê ̣u tới và nhâ ̣n đối tượng mang dữ liê ̣u từ phía máy chủ vSphere.
Hình mình họa mối quan hệ giữa các đối tượng cơ bản trong hệ thống vSphere tương ứng với SDK phiên bản 2.5
Hình 4.9 – Mô hình kết nối giữa các ManagedObject trên vSphere API30
Hình dưới minh họa về mối quan hệ giữa các đối tượng được nêu ở trên . Ứng dụng ở phía máy trạm có một bản đối tượng tham chiếu tới một đối tượng được quản lí là VirtualMachine ở phía máy chủ, và một bản sao lưu về đối tượng mang dữ liê ̣u GuestInfo của VirtualMachine.
Hình 4.10 – Mô hình quan hê ̣ giữa các đối tượng ở phía máy trạm và phía máy chủ vSphere thông qua Web Service31
4.9 Giao diê ̣n lâ ̣p trình mã nguồn mở vSphere Java API
Web Service làm mô ̣t công nghê ̣ tuyê ̣t vời trong giải quyết vấn đề tương thích giữa các nền tảng khác nhau và sự phụ thuộc vào ngôn ngữ lập trình . Tuy nhiên, bản thân Web Service lại tạo ra vấn đề khi tiến hành lập trì nh trên nền tảng của nó, đó là viê ̣c không có khái niê ̣m về hướng đối tượng trong đó.
Trong quá trình bắt tay vào xây dựng ứng du ̣ng dựa trên VMware vSphere Web Service SDK , khi tiến hành viết các lê ̣nh và cha ̣y thử nghiê ̣m để tr uy xuất các đối tượng từ phía các máy chủ vSphere , quá trình gỡ lỗi tốn rất nhiều thời gian và công sức , nhiều câu lê ̣nh rất đơn giản nhưng khi cha ̣y rất lâu và không trả lại kết quả, hoă ̣c phát sinh những lỗi rất khó xác đi ̣nh.
Mô ̣t trong những ha ̣n chế được rất nhiều nhà phát triển đề câ ̣p đến đó là viê ̣c trong VI SDK API tồn ta ̣i các managed object , tuy nhiên trong mô tả của Web Service thì không tồn ta ̣i . Vì vậy, khi sinh ra các stub từ WSDL không tồn ta ̣i các đối tượng thuộc kiểu managed object , do đó ở phía phát triển ứng du ̣ng theo phương pháp hướng đối tượng, không có các managed object để làm viê ̣c.
31 Mô hình quan hê ̣ giữa các đối tươ ̣ng ở phía máy tra ̣m và phía máy chủ vSphere thông qua Web Service , nguồn [7]
Để làm viê ̣c với bất kỳ đối tượng kiểu managed object ở phía máy trạm, mô ̣t ManagedObjectReference được sử du ̣ng, và trong quá trình biên dịch mã nguồn, không hề có lỗi nào được tìm thấy.
Ví dụ về sử dụng ManagedObjectReference
ManagedObjectReference siRef; VimServiceLocator locator; VimPortType service; ServiceContent siContent;
Thiết lập tham chiếu tới đối tượng ServiceInstance
siRef = new ManagedObjectReference(); siRef.setType("ServiceInstance"); siRef.set_value("ServiceInstance");
Tiến hành lấy dữ liệu chứa trong ServiceContent về phía máy trạm siContent = service.retrieveServiceContent(siRef);
if (siContent.getSessionManager() != null) {
service.login(siContent.getSessionManager(), userName, password, null); }
Bảng 4.2 – Bảng mô tả sử dụng lời gọi vSphere API qua Web Services
Ở ví dụ trên đây, nếu như xác đi ̣nh sai về kiểu của đối tượng cần tham chiếu thành “VirtualMachine”, thì trong quá trình biên dịch, không có lỗi xảy ra, trong quá trình chạy câu lệnh , đối tượng tham chiếu vẫn được tìm thấy và không có lỗi. Khi sử du ̣ng thực thế mô ̣t tính năng nào đó của ServiceInstance , hê ̣ thống sẽ sinh ra mô ̣t lỗi rất chung chung như sai kiểu đối tượng.
Mô ̣t lí do nữa đối với Web Service trong trường hợp của
ManagedObjectReference đó là kiểu của đối tượng thực tế khi tham chiếu tới . Người lâ ̣p trình phải xác đi ̣nh được chính xác đối tượng và phương thức , và mã hóa câu lệnh một cách chính xác , trong khi đó quá trình biên di ̣ch không thể phát sinh ra khuyến cáo phù hợp.
Quá trình nghiên cứu và chạy thử nghiệm với VMware vSphere Web
Service SDK gă ̣p nhiều lỗi khiến cho viê ̣c thực hiê ̣n luâ ̣n văn kéo dài và không có kết quả. Viê ̣c thử nghiê ̣m với các ngôn ngữ khác như C # và Perl cũng không đa ̣t được kết quả như mong muốn do vẫn dựa trên cơ chế của Web Service.
Trong quá trình tìm kiếm trên ma ̣ng , tôi tình cờ phát hiê ̣n ra VI (vSphere) Java API được phát triển bởi Steve Jin, mô ̣t chuyên gia phát triển phần mềm làm viê ̣c trong VMware . Steve đã thiết kế mô ̣t tâ ̣p các giao diê ̣n lâ ̣p trình trên nền Java cho phép che dấu đi các tương tác với nền của Web Services, giải quyết các vấn đề về lâ ̣p trình hướng đối tượng trong Web Services , đem la ̣i sự đơn giản cho người phát triển quen thuô ̣c với viê ̣c sử du ̣ng ngôn ngữ hướng đối tượng như Java.
Ví dụ về sự khác nhau giữa cách tiếp cận theo Web Service và vSphere Java API:
Sử dụng ServiceInstance trong Web Service
ManagedObjectReference siRef = new ManagedObjectReference(); siRef.setType("ServiceInstance");
siRef.set_value("ServiceInstance");
VimServiceLocator locator = new VimServiceLocator(); VimPortType service = locator.getVimPort(new URL(url)); locator.setMaintainSession(true);
ServiceContent siContent = service.retrieveServiceContent(siRef); if (siContent.getSessionManager() != null) {
service.login(siContent.getSessionManager(), userName, password, null); }
Sử dụng ServiceInstance trong vSphere Java API
ServiceInstance si = new ServiceInstance(new URL(urlStr), username, password, true);
Bảng 4.3 – Bảng so sánh sự khác nhau giữa lời gọi Web Service và hướng đối tượng trong vSphere Java API
Như vâ ̣y, với viê ̣c sử du ̣ng vSphere Java API sẽ xác đi ̣nh ngay từ ban đầu viê ̣c khởi ta ̣o đối tượng nào ngay ta ̣i thời điểm biên di ̣ch , tránh được việc sử dụng sai đối tượng và phương thức ở Web Service.
Đồng thời cách tiếp cận của Steve cho vSphere Java API thay thế hoàn toàn viê ̣c sử du ̣ng tham chiếu tới đối tượng thông qua ManagedObjectReference bằng viê ̣c thao tác với mô ̣t đối tượng thực tế ở phía máy tra ̣m , đem la ̣i mô ̣t sự quen thuô ̣c cho người lâ ̣p trình quen với phương pháp hướng đối tượng.
Tương tác với đối tượng VirtualMachine ta ̣i phía ứng dụng thay vì sử dụng ManagedObjectReference
ServiceInstance si = new ServiceInstance(new URL(urlStr), username, password, true); Folder rootFolder = si.getRootFolder();
VirtualMachine vm = (VirtualMachine) new InventoryNavigator( rootFolder).searchManagedEntities(“VirtualMachine”)[0];
Bảng 4.4 – Ví dụ lời gọi từ vSphere API không sử dụng ManagedObjectReference
4.10 Các từ khóa, thuật ngữ và định nghĩa
Template: trong phạm vi của luận văn này, template là một máy ảo được khởi tạo, cài đặt đầy đủ các chức năng trên hệ thống của VMware . Mỗi một máy ảo khi được chương trình tìm thấy trong hệ thống, sau khi được người quản trị kiểm duyệt và lựa chọn sẽ được đánh dấu là một template.
Catalog: danh sách các máy ảo được người quản trị hệ thống chọn lựa, đánh dấu như các template. Đây là những máy ảo mà người sử dụng khi truy xuất vào hệ thống nhìn thấy được, và khởi tạo máy ảo của riêng họ theo cấu hình đã quy định sẵn.
Virtual Data Center (VDC): mỗi tổ chức đăng ký trong hệ thống sẽ tự động tạo ra một trung tâm dữ liệu ảo. Trung tâm dữ liệu ảo này là một pool tài nguyên trong hệ thống VMware. Có thể thiết lập pool này có tài nguyên tính toán như năng lực của vi xử lý tính theo MHz và năng lực bộ nhớ tính theo MB. Ở trạng thái mặc định khi khởi tạo, pool tài nguyên này không hạn chế về năng lực, có khả năng mở rộng trên nhóm máy chủ được thiết lập theo cụm (cluster).
4.11 Các nhóm ngƣời sử dụng trong hệ thống
Hệ thống có ba nhóm người, mỗi nhóm có vai trò khác nhau, thông tin chi tiết về mỗi nhóm thể hiện dưới đây:
Nhóm người sử dụng Vai trò
Admininistrator Người sử dụng đóng vai trò quản trị của hệ thống, người này có quyền kết nối hệ thống tới vCenter Server của hạ tầng, và
4.12 Các use-case trong hệ thống:
Use-case cho trườ ng hợp truy xuất hê ̣ thống với vai trò của người sử dụng hệ thống.
User
Regiser Account
Users
Login
Search Department Create Department and Virtual Data Center
Create Account Browse Catalogs View List of Virtual Machine Deploy a Virtual Machine Power Management Edit Virtual Machine View Report
Hình 4.11 – Các use-case với vai trò người sử dụng hê ̣ thống
Use-case cho trườ ng hợp truy xuất hê ̣ thống với vai trò là người quản tri ̣ của hê ̣ thống.
cho phép khởi tạo, xét duyệt các máy ảo mẫu trong hệ thống
Admin của tổ chức Người sử dụng đóng vai trò quản trị trung tâm dữ liệu ảo của tổ chức, được quyền thay đổi thông tin của người sử dụng thuộc tổ chức đó, cũng như được quyền đồng ý sử dụng tài nguyên máy ảo
User của tổ chức Người sử dụng thuộc một tổ chức phòng ban nằm trong hệ thống, có quyền chọn lựa máy ảo, và khởi tạo dịch vụ
Administrator
Login Manage vCenter and
Catalog List vCenter Server
Edit vCenter Server
Load and Approval Template
List Catalog Manage Users
View Report
Hình 4.12 – Các use-case với vài trò người quản tri ̣ hê ̣ thống
Các use-case cụ thể của hệ thống được mô tả chi tiết trong bảng dưới đây:
Tên các use case Mô tả
Register Account Người sử dụng khi truy xuất vào hệ
thống cần phải có tài khoản trong hệ thống. Ở lần đầu tiên truy cập, hệ thống sẽ yêu cầu khởi tạo một tài khoản
Login Người sử du ̣ng truy xuất vào hê ̣ thống
Search Department Ở bước khởi tạo tài khoản, người đăng
ký phải tìm một tổ chức mà mình là nhân viên trong hệ thống
Create Department and DataCenter Khởi tạo một tổ chức mới trong hệ thống, mỗi một tổ chức trong hệ thống như vậy được gắn với một datacenter, có thể thiết lập một dung lượng tài nguyên về CPU và RAM nhất định cho mỗi datacenter
Create Account Tạo ra một tài khoản trên hệ thống
use case về quản lý các hệ thống cấp phát tài nguyên ảo vCenter Server, nhóm các template máy ảo và quản lý nhóm người sử dụng trong hệ thống
Manage vCenter and Catalog Giao diện chính cho phép hiển thị phần liệt kê danh sách các vCenters
Bảng 4.6 – Bảng mô tả các use-case chi tiết khi người quản trị truy cập
4.13 Thiết kế chi tiết các use-case điển hình
4.14 Use-case đăng nhập hê ̣ thống (Login Use-case)
Lược đồ truy xuất tuần tự
Top Package::User LoginForm LoginAction Login AccountManager HibernateSessionFactory execute() getAccountByPrimaryKey() Transaction currentSession() Session beginTransaction() return Account get() return
Hình 4.13 – Lược đồ truy xuất tuần tự khi người sử dụng đăng nhập
Lược đồ các lớp trong use-case đăng nhâ ̣p hê ̣ thống
LoginForm: lớ p mở rô ̣ng từ lớp ActionForm trong Struts , mô hình hóa các đối tượng đa ̣i di ện cho một trang HTML . Lớp này đóng vai trò view trong mô hình MVC.
LoginAction: lớ p mở rô ̣ng từ lớp ActionForm trong Struts , mô hình hóa viê ̣c nhâ ̣n và xử lí từ được gửi từ lớp LoginForm tới . Lớp này đóng vai trò là controller trong mô hình MVC.
AccountManager: lớ p này đóng vai trò là lớp hỗ trợ cho các yêu cầu xử lí từ LoginAction, thay vì nhúng tất cả mã nguồn xử lý ở phần web, mọi lời gọi tới các tương tác với nền ứng dụng bên dưới như cơ sở dữ liê ̣u sẽ được xuất phát từ đây.
Account: lớ p này mô hình hóa mô ̣t tài khoản trong hê ̣ thống , được sử du ̣ng cho viê ̣c nhâ ̣n dữ liê ̣u từ LoginForm , đo ̣c và ghi xuống cơ sở dữ liê ̣u ở tầng dưới. Lớp này đa ̣i diê ̣n cho model trong mô hình MVC.
HibernateSessionFactory, Transaction, Session: đây là các lớp thuô ̣c thư viê ̣n Hibernate dành cho viê ̣c truy xuất xuống cơ sở dữ liê ̣u ở tầng dưới . Cách tiếp câ ̣n này tránh viê ̣c sai sót trong sử du ̣ng các câu lê ̣nh SQL khi đo ̣c, ghi dữ liê ̣u từ cơ sở dữ liê ̣u ở tầng dưới.
+execute() -TYPE_LOGIN -STATUS_FAILED -log «implementation class»LoginAction +setUsername() +getUsername() +setPassword() +getPassword() -username -password «implementation class»LoginForm +getAllAccounts[]() +getAccountByPrimaryKey() +getAccountByUsernameAndPassword() +saveAccount() +removeAccountByPrimaryKey() +getAllVMServers() +getVirtualServerByPrimaryKey() AccountManager +getAccountid() +setAccountid() +getUserrightid() +setUserrightid() +getAccountname() +setAccountname() +getUsername() +setUsername() +getPassword() +setPassword() +getEmail() +setEmail() +getPhone() +setPhone() +getCreditcard() +setCreditcard() +getDepartmentid() +setDepartmentid() -accountid -userrightid -accountname -username -password -address -email -phone -creditcard -departmentid Account +currentSession() +closeSession() +() -CONFIG_FILE_LOCATION -cfg -sessionFactory HibernateSessionFactory +beginTransaction() +commit() «implementation class» Session +currentSession() «implementation class» Transaction
Hình 4.14 – Lược đồ lớp trong use-case đăng nhập
4.15 Use-case tìm và liê ̣t kê danh sách các template máy ảo có trong hê ̣ thống vCenter Server vCenter Server
OrganizationList TemplateList vCenterManager vCenter VMConnection VMInfo VMTemplate Top Package::Admin Message1 loadTemplate() getAllvCenters() getVcenter_username() getVcenter_password() openConnection() getVMTemplateFromVI() InventoryNavigator searchManagedEntities() VirtualMachine search return return TemplateManager saveTemplate() return
Hình 4.15 – Lược đồ truy xuất tuần tự quá trình truy xuất và tìm kiếm máy ảo trên hê ̣ thống
Lược đồ lớp
OrganizationListForm: lớ p mở rô ̣ng từ lớp ActionForm trong Struts , mô hình hóa các đố i tượng đa ̣i diê ̣n cho mô ̣t trang HTML . Lớp này đóng vai trò view trong mô hình MVC.
OrganizationListAction: lớ p mở rô ̣ng từ lớp ActionForm trong Struts , mô hình hóa việc nhận và xử lí từ được gửi từ lớp OrganizationListForm tới . Lớ p này đóng vai trò là controller trong mô hình MVC.
+setVirtualServers() +getVirtualServers[]() -virtualServers[] «implementation class» OrganizationListForm +execute() «implementation class» OrganizationListAction +serUrl() +getUrl() +setUsername() +getUsername() +setPassword() +getPassword() +openConnection() +getServiceInstance() +getSearchIndex() +closeConnection() +getRootFolder() +getInstanceUid() +getAllDatacenters[]() +getTheFirstDatacenter() +getParentDatacenter() +createFolder() +existFolder() +getVLAN() +createResourcePool() +getResourcePool() +moveToResourcePool() +getAlHostSystems() -si -url -username -password -rootFolder -mes[] -vm -vmInfo -vmc VMConnection +getAllVirtualMachines() +getVirtualMachineByName() +getVMPowerState() +getVirtualMachineByUuid() +getVMRemoteConsole() +createScsiSpec() +createDiskSpec() +createNicSpec() +getVMTemplateFromVI[]() +createVirtualMachine() +getDiskDeviceConfigSpec() +getDataStoreName() -_vmCon VMInfo +getAllvCenter() +getvCenterByIp() +getRowByPrimaryKey() +savevCenter() +removevCenterByPrimaryKey() vCenterManager +getAllTemplate[]() +getAllTemplateByAccountId[]() +getTemplateByUuid() +getTemplateByPrimaryKey() +saveTemplate() +removeTemplateByPrimaryKey() TemplateManager +currentSession() +closeSession() +() -CONFIG_FILE_LOCATION -cfg -sessionFactory HibernateSessionFactory +setVcenterid() +getVcenterid() +setVcenter_name() +getVcenter_name() +setVcenter_ip() +getVcenter_ip() +setVcenter_username() +getVcenter_username() +setVcenter_password() +getVcenter_password() -vcenterid -vcenter_name -vcenter_ip -vcenter_username -vcenter_password Vcenter +getTemplateid() +setTemplateid() +getDatacenter() +setDatacenter() +getVmpathname() +setVmpathname() +getName() +setName() +getGuestfullname() +setGuestfullname() +getAnnotation() +setAnnotation() +getUuid() +setUuid() +getMemorymb() +setMemorymb() +getNumcpu() +setNumcpu() +gethddkb() +setHddkb() +getMaxvcpu() +setMaxvcpu() +getMaxmemmb() +setIp() +getIp() -templateid -serverurl -datacenter -vmpathname -name -guestfullname -annotation -guestid -description -accountid -uuid -memmorymb -numcpu -hddkb -maxvcpu -maxmemb «implementation class» VMTemplate +searchManagedEntities() InventoryNavigator +listTemplate() +reviewToDeploy() +loadTemplate() +addDescription() «implementation class» TemplateListAction +getTemplates[]() +setTemplates() +getTemplateid() +setTemplateid() -templates[] -templateid «implementation class»TemplateListForm +beginTransaction() +commit() «implementation class» Session +currentSession() «implementation class» Transaction
Hình 4.16 – Lược đồ lớp trong use-case tìm kiếm và liê ̣t kê máy ảo
TemplateListForm: lớ p mở rô ̣ng từ lớp ActionForm trong Struts , mô hình hóa các đối tượng đại diện cho một trang HTML . Lớp này thể hiê ̣n viê ̣c hiê ̣n thi ̣ danh sách các template trong hê ̣ thống và đóng vai trò view trong mô hình
MVC.
TemplateListAction: lớ p mở rô ̣ng từ lớp ActionForm trong Struts , mô hình hóa việc nhận và xử lí từ được gửi từ lớp TemplateListForm tớ i, nhâ ̣n xử lí các