Servlet controller nhâ ̣n các yêu cầu xử lý từ phía trình duyê ̣t web của máy trạm, đi ̣nh hướng cả yêu cầu tới các lớp đóng vai trò xử lý yêu cầu trong ứng du ̣ng . Trong Struts framework, struts-config.xml có chức năng như mô ̣t controller , sẽ đi ̣nh hướng các yêu cầu ở các URL cu ̣ thể vào các action class cu ̣ thể.
<form-bean name="templateListForm" type="viapp.vps.form.TemplateListForm"/> <action path="/ListTemplate" input="/vps/ListTemplate.jsp" attribute="templateListForm" name="templateListForm" parameter="do" scope="request" type="viapp.vps.action.TemplateListAction">
<forward name="showTemplateList" path="/vps/ListTemplate.jsp" />
<forward name="showRefreshTemplate" path="/ListTemplate.do?do=listTemplate"/> </action>
4.21 Mã hóa giao diện web
Giao diê ̣n web trong Struts framework bao gồm hai thành phần kết hợp với nhau là các trang Java Server Pages chứa mã HTML , Javascript, Stylesheet và mô ̣t lớp mở rô ̣ng từ lớp ActionForm có các thuô ̣c tính và phương thức tương ứng với các đối tượng trong trang Java Server Pages.
<tableid="vtable"width="800"> <tr>
<td></td> <td>Name</td> <td>Description</td> <td>Action</td>
</tr><logic:iteratename="templateListForm"property="templates"id="vmtemplate"> <tr>
<tdalign="center">
<html:linkaction="/EditVMLease.do?do=editVMLease"
paramName="vmtemplate"
paramProperty="templateid"
paramId="templateid"><imgsrc="<html:rewritepage='/images/power/mycloud.png'/>">
Deploy</html:link>
<td><bean:writename="vmtemplate"property="name"/></td> <td><bean:writename="vmtemplate"property="description"/></td> <td><html:linkaction="/EditTemplate.do?do=editTemplate"
paramName="vmtemplate"
paramProperty="templateid"
paramId="templateid">Update</html:link> <html:linkaction="/EditTemplate.do?do=removeTemplate"
paramName="vmtemplate"
paramProperty="templateid"
paramId="templateid">Remove</html:link> </td>
</tr>
</logic:iterate> <tr>
<tdcolspan="4"align="left">* select icon to deploy virtual machine</td> </tr>
<logic:notPresentname="vmtemplate"> <tr>
<tdcolspan="9">No template found</td> </tr>
</logic:notPresent> </table>
Bảng 4.9 – Bảng mô tả mã hóa một trang jsp theo cách viết Struts
Lớp TemplateListForm gắn với danh sách các đối tượng trong Java Serve r Pages ở phần giao diê ̣n web.
publicclassTemplateListFormextends ActionForm {
private VMTemplate[] templates = new VMTemplate[0];
private Integer templateId;
public TemplateListForm() {super();}
public VMTemplate[] getTemplates(){returnthis.templates;}
publicvoid setTemplates(VMTemplate[] tpl){this.templates=tpl;}
publicvoid setTemplateid(Integer id){this.templateId = id;}
public Integer getTemplateid(){returnthis.templateId;}}
Bảng 4.10 – Bảng mô tả mã hóa đối tượng form trong Struts
Mô ̣t yêu cầu truy xuất từ giao diê ̣n Java Ser ver Pages ở trên , sẽ được xử lý tại controller thông qua việc chuyển hướng yêu cầu tới một phương thức của mô ̣t lớp mở rô ̣ng từ lớp Action hoă ̣c lớp DispatchAction.
publicclass TemplateListAction extends DispatchAction{ //Action {
/** Logger for this class and subclasses */
protectedfinal Logger log = Logger.getLogger(getClass());
private String serverURL = ""; //vCenter Server address
private String userName= "";
private String password= "";
private String serverIp="";
public ActionForward listTemplate(ActionMapping mapping, ActionForm inForm,
HttpServletRequest request, HttpServletResponse response) throws Exception{
log.debug("TemplateListAction.execute()");
HttpSession session = request.getSession();
Integer accountid =(Integer)session.getAttribute("CUST_ID");
TemplateListForm listForm = (TemplateListForm)inForm;
TemplateManager manager = new TemplateManager();
listForm.setTemplates(manager.getAllTemplates());
return mapping.findForward("showTemplateList"); }
public ActionForward loadTemplate(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){
try{
System.out.println("updateTemplateFromVI");
//call VMware server, and update the vmtemplate table
HttpSession session = request.getSession();
Integer accountid =(Integer)session.getAttribute ("CUST_ID");
vCenterManager vCM = new vCenterManager();
Vcenter[] vcenters = vCM.getAllvCenters();
for(int i=0; i<vcenters.length;i++){
if(vcenters[i].getVcenter_ip()!=null){
serverURL = "https://" + vcenters[i].getVcenter_ip() + "/sdk";}else{
serverURL = "https://" + vcenters[i].getVcenter_name() + "/sdk";}
userName = vcenters[i].getVcenter_username();
password = vcenters[i].getVcenter_password();
VMInfo vmInfo = new VMInfo(vmc);
TemplateListForm listForm = (TemplateListForm)form; listForm.setTemplates(
vmInfo.getVMTemplateFromVI(accountid));
VMTemplate[] templates = listForm.getTemplates();
if(templates.length>0){
TemplateManager manager = new TemplateManager();
for(int j=0;j<templates.length;j++){
if(manager.getTemplateByUUid(
templates[j].getUuid())==null) manager.saveTemplate(templates[j]);
} }
}
}catch(Exception ex){ex.printStackTrace();}
return mapping.findForward("showRefreshTemplate"); }
}
Bảng 4.11 – Bảng mô tả mã hóa đối tượng action trong Struts
4.22 Mã hóa truy xuất thông tin về các máy ảo mẫu từ hệ thống ảo hóa
Thiết lâ ̣p kết nối tới máy chủ ảo hóa vCenter Server:
publicstaticvoid openConnection(String url, String username, String password) throws Exception{
si = new ServiceInstance(new URL(url), username, password, true);}
Bảng 4.12 – Bảng mô tả kết nối với máy chủ ảo hóa
Một danh sách các máy ảo trong hệ thống được liệt kê dựa trên phép tìm kiếm các đối tượng được quản lý bởi vCenter Server:
public VirtualMachine[] getAllVirtualMachines(Folder rootFolder)throws Exception{
ManagedEntity[] vms = new InventoryNavigator(rootFolder)
.searchManagedEntities(new String[][]
{ {"VirtualMachine", "name" }, }, true);
if(vms.length>0){
VirtualMachine[] vm = new VirtualMachine[vms.length];
for(int i=0;i<vms.length;i++){
vm[i]=(VirtualMachine)vms[i]; }
return vm; }elsereturnnull; }
Thông tin chi tiết của các máy ảo được lấy từ máy chủ vCenter Server sẽ được phân tích và na ̣p vào đối tượng thuô ̣c kiểu VMTemplate.
VirtualMachine v = vmArray[j];
VirtualMachineConfigInfo vmInfo = v.getConfig();
VMTemplate vmTem = newVMTemplate();
vmTem.setAccountid(accountid);
Datacenter dc = _vmCon.getParentDatacenter(v);
vmTem.setDatacenter(dc.getName()); vmTem.setUuid(vmInfo.getUuid()); vmTem.setName(vmInfo.getName()); vmTem.setServerurl(VMConnection.getUrl()); vmTem.setGuestid(vmInfo.getGuestId()); vmTem.setAnnotation(vmInfo.getAnnotation()); vmTem.setGuestfullname(vmInfo.getGuestFullName()); vmTem.setVmpathname(vmInfo.getFiles().getVmPathName()); VirtualHardware vHw = vmInfo.getHardware(); vmTem.setNumcpu(vHw.getNumCPU()); vmTem.setMemorymb(vHw.getMemoryMB());
for(int k=0;k<vHw.getDevice().length;k++){
VirtualDevice vD = (vHw.getDevice())[k]; Description d = vD.getDeviceInfo();
if(d.getLabel().startsWith("Hard disk")){ VirtualDisk vDisk = (VirtualDisk)vD;
vmTem.setHddkb(vDisk.getCapacityInKB()); }
}
ComputeResource rs = (ComputeResource) new
InventoryNavigator(dc).searchManagedEntities("ComputeResource")[0];
ComputeResourceSummary rsSum = rs.getSummary(); Short maxvcpu = rsSum.getNumCpuCores();
Long maxmemmb = rsSum.getEffectiveMemory(); vmTem.setMaxvcpu(maxvcpu);
vmTem.setMaxmemmb(maxmemmb);
Bảng 4.14 – Bảng mô tả lấy thông tin chi tiết của các máy ảo từ máy chủ ảo hóa
4.23 Mã hóa quá trình lƣu trữ dữ liệu xuống cơ sở dữ liệu
Ứng dụng sử dụng Hibernate Framework để đơn giản hóa quá trình ghi dữ liê ̣u xuống cơ sở dữ liê ̣u . Các bước tiến hành để Hibernate hoạt động được cho trường hợp mã hóa bao gồm:
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
Bảng 4.15 – Bảng mô tả tệp cấu hình của Hibernate
Đi ̣nh nghĩa cơ sở dữ liê ̣u cần truy xuất và các đối tượng cần thự c hiện ghi xuống cơ sở dữ liê ̣u.
<?xmlversion='1.0'encoding='UTF-8'?>
<!DOCTYPEhibernate-configurationPUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration> <session-factory>
<!-- mysql configuration -->
<propertyname="connection.url">jdbc:mysql://localhost/vapp</property> <propertyname="connection.username">vdc_admin</property>
<propertyname="connection.password">123456</property> <propertyname="connection.driver_class">com.mysql.jdbc.Driver
</property>
<propertyname="dialect">org.hibernate.dialect.MySQLDialect
</property>
<mappingresource="viapp/account/domain/Account.hbm.xml"/> <mappingresource="viapp/account/domain/Department.hbm.xml"/> <mappingresource="viapp/vps/domain/Row.hbm.xml"/>
<mappingresource="viapp/vps/domain/GroupServer.hbm.xml"/> <mappingresource="viapp/vps/domain/VirtualServer.hbm.xml"/> <mappingresource="viapp/vps/domain/VMTemplate.hbm.xml"/> <mappingresource="viapp/vps/domain/Vcenter.hbm.xml"/> <mappingresource="viapp/utility/Constant.hbm.xml"/> <mappingresource="viapp/vps/domain/VMLease.hbm.xml"/> </session-factory>
</hibernate-configuration>
Bảng 4.16 – Bảng mô tả nội dung tệp cấu hình trong Hibernate
Đi ̣nh nghĩa tê ̣p cấu hình với t ên chính xác như tên của lớp cần ghi xuống cơ sở dữ liê ̣u , với viê ̣c đi ̣nh nghĩa tên cô ̣t trong cơ sở dữ liê ̣u tương ứng với tên thuô ̣c tính cần ghi la ̣i và chính xác kiểu dữ liê ̣u tương ứng với cơ sở dữ liê ̣u.
<?xmlversion="1.0"encoding='UTF-8'?>
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mappingpackage="viapp.vps.domain">
<classname="VMTemplate"table="VMTemplate"> <idname="templateid"
column="templateid"type="java.lang.Integer"> <generatorclass="increment"/> </id>
<propertyname="serverurl"
column="serverurl"type="java.lang.String"/> <propertyname="datacenter"
column="datacenter"type="java.lang.String"/> <propertyname="vmpathname"
column="vmpathname"type="java.lang.String"/> <propertyname="uuid"
column="uuid"type="java.lang.String"/> <propertyname="name"
column="name"type="java.lang.String"/> <propertyname="guestfullname"
column="guestfullname"type="java.lang.String"/> <propertyname="annotation"
column="annotation"type="java.lang.String"/> <propertyname="guestid"
column="guestid"type="java.lang.String"/> <propertyname="description"
column="description"type="java.lang.String"/> <propertyname="accountid"
column="accountid"type="java.lang.Integer"/> <propertyname="numcpu"
column="numcpu"type="java.lang.Integer"/> <propertyname="memorymb"
column="memorymb"type="java.lang.Integer"/> <propertyname="hddkb"
column="hddkb"type="java.lang.Long"/> <propertyname="maxvcpu"
column="maxvcpu"type="java.lang.Short"/> <propertyname="maxmemmb"
column="maxmemmb"type="java.lang.Long"/> </class>
</hibernate-mapping>
Bảng 4.17 – Bảng mô tả định nghĩa thông tin về đối tượng VMTemplate
Quá trình tiến hành ghi dữ liệu từ một đối t ượng xuống cơ sở dữ liệu thực hiê ̣n hoàn toàn tự đô ̣ng thông qua Hibernate.
/* a Hibernate session */
Session session = null;
/* we always need a transaction */
Transaction tx = null;
/* get session of the current thread */
session = HibernateSessionFactory.currentSession();
tx = session.beginTransaction();
VMTemplate tpl = new VMTemplate();
BeanUtils.copyProperties(tpl,tplValue);
session.save(tpl); tx.commit();
4.24 Chạy thử nghiệm chƣơng trình
4.25 Truy xuất hê ̣ thống với vai trò ngƣời quản tri ̣ hê ̣ thống
Hình 4.18 – Màn hình truy cập tới hệ thống VMMS
Màn hình đăng nhập với vai trò người quản trị hiển thị các chức năng như quản trị vCenter Server, quản trị các Catalogs và quản tri ̣ người sử du ̣ng.
Hình 4.19 –Màn hình sau khi đăng nhập hê ̣ thống
Truy xuất tính năng quản tri ̣ vCenter Server
Hình 4.20 – Thông tin về máy chủ truy cập hê ̣ thống ảo hóa vCenter
Sửa hoă ̣c thêm mới thông tin về vCenter Server
Hình 4.21 – Màn hình nhập thông tin vCenter
Truy xuất tính năng quản tri ̣ các Catalog
Sau khi cho ̣n vào liên kết quản tri ̣ Catalog , hê ̣ thống cho ta truy xuất tới danh mục các Catalog đang tồn tại trong hệ thống.
Hình 4.22 – Danh sách các máy ảo tiêu chuẩn trong hê ̣ thống
Để câ ̣p nhâ ̣t thêm các catalog mới từ hê ̣ thống , nhấp vào liên kết truy vấn các template máy ảo từ các vCenter đang đăng ký trong hê ̣ thống.
Hình 4.23 – Người quản tri ̣ sẽ duyê ̣t máy ảo tiêu chuẩn mới
Người quản tri ̣ sẽ làm công tác duyê ̣t các template chuẩn và cho phép template đó được sử du ̣ng.
Hình 4.24 – Màn hình cập nhật thông tin về máy ảo tiêu chuẩn mới
Ở màn hình dưới, sẽ chọn thêm chỉ một máy ảo là Demo -AD đóng vai trò là template mới của hê ̣ thống, các máy ảo khác không được đăng ký vào hệ thống.
4.26 Truy xuất hê ̣ thống với vai trò ngƣời sƣ̉ du ̣ng thuô ̣c mô ̣t tổ chƣ́c trong hê ̣ thống
Màn hình truy cập của người sử dụng có sự khác biệt ở so với người quản trị là họ chỉ được xem da nh sách các template có trong hê ̣ thống cũng như danh mu ̣c các máy ảo của ho ̣ đã khởi ta ̣o . Ngườ i sử du ̣ng không có quyền đăng ký các template máy ảo trong hê ̣ thống.
Người sử du ̣ng truy câ ̣p danh mu ̣c các template
Người sử du ̣ng xem được danh sách các template đang có trong hê ̣ thống, tuy nhiên không có quyền sửa thông tin liên quan tới template đang có.
Hình 4.26 – Giao diê ̣n danh mục các máy ảo tiêu chuẩn ở phía người sử dụng
Để triển khai mô ̣t máy ảo mới dựa trên template , người sử du ̣ng sẽ nhấn vào biểu tượng Deploy ở phía trái của template . Trong ví du ̣ này , để đơn giản DOS template sẽ được lựa cho ̣n.
Hình 4.27 – Người sử dụng chọn triển khai máy ảo mới
Hê ̣ thống sẽ ra lê ̣nh cho vCenter Server thực hiê ̣n linked clone máy ảo DOS trong pool tài nguyên thuô ̣c nhóm HR Department , pool này đóng vai trò trung tâm dữ liệu ảo của một tổ chức trong hệ thống.
Màn hình hiển thị danh sách máy ảo của ngườ i sử du ̣ng hiê ̣n ra với máy ảo mới được tạo, người sử du ̣ng có thể ra lê ̣nh bâ ̣t máy ảo từ đây.
Sau khi cho ̣n nút check box phía bên phải, và nhấn vào nút Power On.
Hình 4.29–Máy ảo chuyển sang trạng thái hoạt động
Ở phía màn hình của vCenter, máy ảo đã hoạt động như ra lệnh.
4.27 Tổng kết
Chương trình được thực hiê ̣n được những tính năng cơ bản cho phép tương tác với hạ tầng ảo hóa VMware vSphere , cho phép người sử du ̣ng có thể đi ̣nh nghĩa được các máy ảo tiêu chuẩn dưới dạng máy ảo tiêu chuẩn . Ngoài ra , chương trình cho phép người sử du ̣ng đơn giản hóa quá trình khởi ta ̣o máy ảo theo nhu cầu , thông qua viê ̣c truy xuất trên giao diê ̣n Web quen thuô ̣c , không cần sự tham gia quản tri ̣ của người quản tri ̣ hê ̣ thống.
Do mu ̣c đích đă ̣t ra khi ph át triển chương trình ở giai đoạn làm luận văn nên tôi chỉ tâ ̣p trung vào phát triển những tính năng cơ bản , vì vậy một số nhược điểm cần hoàn thiê ̣n thêm đó là chương trình ở mức khá cơ bản , giao diê ̣n Web đơn giản, khả năng tương tác chưa thân thiê ̣n . Còn nhiều tính năng khác có thể bổ xung thêm cho chương trình mang tính ứng du ̣ng sát thực tế hơn nữa như là hoạch định dung lượng lưu trữ cho mỗi trung tâm dữ liê ̣u ảo , xác định dung lượng lưu trữ cò n đủ để máy ảo có thể khởi ta ̣o không, cho phép xác đi ̣nh máy ảo được khởi tạo có thực sự hoạt động hay không, hoă ̣c những khả năng như sau giai đoa ̣n máy ảo hoa ̣t đô ̣ng quá thời ha ̣n thì các hướng xử lý như là tắt máy ảo , xóa khỏi hệ thống hoặc sao lưu ra vùng dữ liệu khác.
KẾT LUẬN 5.1 Đánh giá
Qua quá trình thực hiê ̣n luâ ̣n văn, tôi đã đa ̣t được những kết quả sau:
Tìm hiểu tổng quan được quá trình hình thành , khái niệm, các ứng nhược điểm của mô hình điện toán đám mây. Song song với quá trình này nghiên cứu thêm về những công nghê ̣ nền tảng hỗ trợ cho viê ̣c triển khai điện toán đám mây tại các doanh nghiệp
Tìm hiểu được các hệ thống ảo hóa hạ tầng của các hã ng khác nhau , tìm hiểu được cách tiếp câ ̣n xây dựng hê ̣ thống điện toán đám mây của các hãng khác nhau
Tìm hiểu, thử nghiê ̣m được công nghê ̣ điện toán đám mây xây dựng trên nền của VMware và hê ̣ thống các hàm API cung cấp của VMware
Thông qua viê ̣c nghiên cứu về điện toán đám mây cũng rút ra được kết luâ ̣n trong viê ̣c tiếp câ ̣n với công nghê ̣ này khi tư vấn cho các doanh nghiê ̣p.
5.2 Hƣớng phát triển, mở rô ̣ng luâ ̣n văn
Đến thời điểm này , điê ̣n toán đám mây không còn là một công nghệ quá xa lạ đối với các doanh nghiệp ở Việt Nam . Tuy nhiên khoảng cách từ vấn đề công nghê ̣ tới viê ̣c triển khai thực tế vẫn còn thời gian khá dài do ngân sách và chính sách áp dụng trong mỗi tổ chức.
Với các doanh nghiệp lớn , mặc dù có lô ̣ trình rõ ràng trong triển khai mô ̣t giải pháp đám mây hoàn chỉnh , tuy nhiên với tốc đô ̣ tăng trưởng nhanh , sức ép lên các nhóm ha ̣ tầng rất lớn thì thay vì chờ đợi mô ̣t giải pháp hoàn chỉnh có thể áp dụng chương trình quản trị máy ảo để tăng khả năng cấp phát máy ảo theo nhu cầu của doanh nghiê ̣p . Nhiều tính năng mới có thể bổ xung thêm khiến cho chương trình hoàn chỉnh hơn như đi ̣nh nghĩa năng lực tính to án cho từng trung tâm dữ liê ̣u ảo , cho phép người sử du ̣ng đi ̣nh nghĩa các dải IP , cung cấp khả năng tính cước đơn giản như tính theo dung lượng bộ nh ớ cấp phát hoă ̣c số lượng vCPU sử du ̣ng cho mỗi máy ảo.
Nếu phát triển đầy đ ủ các tính năng kể trên , chương trình có thể áp du ̣ng rô ̣ng rãi cho các nhóm chuyên làm công tác đảm bảo ha ̣ tầng ảo hóa của các doanh nghiê ̣p, có thể sử dụng cho những nhóm chuyên phát triển phần mềm để đảm bảo khả năng cấp phát và quản lý cấu hình.
Mô ̣t đi ̣nh hướng riêng của tôi là tiếp tục nghiên cứu , tư vấn triển khai điê ̣n