You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by se...@apache.org on 2014/06/20 15:27:41 UTC
[5/7] CLOUDSTACK-6967: Now with module!
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/pom.xml
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/pom.xml b/plugins/hypervisors/ovm3/pom.xml
new file mode 100644
index 0000000..22c9fe0
--- /dev/null
+++ b/plugins/hypervisors/ovm3/pom.xml
@@ -0,0 +1,36 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>cloud-plugin-hypervisor-ovm3</artifactId>
+ <name>Apache CloudStack Plugin - Hypervisor OracleVM3</name>
+ <parent>
+ <groupId>org.apache.cloudstack</groupId>
+ <artifactId>cloudstack-plugins</artifactId>
+ <version>4.4.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.cloudstack</groupId>
+ <artifactId>xapi</artifactId>
+ <version>${cs.xapi.version}</version>
+ </dependency>
+ </dependencies>
+</project>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-compute/module.properties
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-compute/module.properties b/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-compute/module.properties
new file mode 100644
index 0000000..69e6469
--- /dev/null
+++ b/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-compute/module.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+name=ovm3-compute
+parent=compute
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-compute/spring-ovm3-compute-context.xml
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-compute/spring-ovm3-compute-context.xml b/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-compute/spring-ovm3-compute-context.xml
new file mode 100644
index 0000000..42230c9
--- /dev/null
+++ b/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-compute/spring-ovm3-compute-context.xml
@@ -0,0 +1,39 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:aop="http://www.springframework.org/schema/aop"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-3.0.xsd"
+ >
+
+ <bean id="Ovm3Fencer" class="com.cloud.hypervisor.ovm3.hypervisor.Ovm3Fencer">
+ <property name="name" value="Ovm3FenceBuilder" />
+ </bean>
+
+ <bean id="Ovm3Guru" class="com.cloud.hypervisor.ovm3.hypervisor.Ovm3Guru">
+ <property name="name" value="Ovm3Guru" />
+ </bean>
+
+
+</beans>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-discoverer/module.properties
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-discoverer/module.properties b/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-discoverer/module.properties
new file mode 100644
index 0000000..025d4cf
--- /dev/null
+++ b/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-discoverer/module.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+name=ovm3-discoverer
+parent=discoverer
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-discoverer/spring-ovm3-discoverer-context.xml
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-discoverer/spring-ovm3-discoverer-context.xml b/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-discoverer/spring-ovm3-discoverer-context.xml
new file mode 100644
index 0000000..aa76271
--- /dev/null
+++ b/plugins/hypervisors/ovm3/resources/META-INF/cloudstack/ovm3-discoverer/spring-ovm3-discoverer-context.xml
@@ -0,0 +1,34 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:aop="http://www.springframework.org/schema/aop"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-3.0.xsd"
+ >
+
+ <bean id="Ovm3Discoverer" class="com.cloud.hypervisor.ovm3.hypervisor.Ovm3Discoverer">
+ <property name="name" value="Ovm3Discover" />
+ </bean>
+
+</beans>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/scripts/clean_master.sh
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/scripts/clean_master.sh b/plugins/hypervisors/ovm3/scripts/clean_master.sh
new file mode 100755
index 0000000..bbf1cd0
--- /dev/null
+++ b/plugins/hypervisors/ovm3/scripts/clean_master.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+for i in `xm list | awk '{ print $1 }' | egrep -v "Name|Domain-0"`
+do
+ xm destroy $i
+done
+rm /etc/ovs-agent/db/server
+rm /etc/ovs-agent/db/repository
+rm /etc/ocfs2/cluster.conf
+rm /nfsmnt/*/*.img
+rm /nfsmnt/*/.ovspoolfs
+rm /nfsmnt/*/.generic_fs_stamp
+rm /OVS/Repositories/*/.generic_fs_stamp
+rm /OVS/Repositories/*/.ovsrepo
+/etc/init.d/ovs-agent restart
+/etc/init.d/ocfs2 restart
+for i in `mount | grep cs-mgmt | awk '{ print $1 }'`
+do
+ umount $i
+done
+rm -rf /OVS/Repositories/*
+rm -rf /nfsmnt/*
+ip addr del 192.168.1.230 dev c0a80100
+ip addr del 192.168.1.161 dev c0a80100
+rm /etc/sysconfig/network-scripts/ifcfg-control0
+reboot
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/scripts/clean_slave.sh
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/scripts/clean_slave.sh b/plugins/hypervisors/ovm3/scripts/clean_slave.sh
new file mode 100755
index 0000000..6d46859
--- /dev/null
+++ b/plugins/hypervisors/ovm3/scripts/clean_slave.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+for i in `xm list | awk '{ print $1 }' | egrep -v "Name|Domain-0"`
+do
+ xm destroy $i
+done
+rm /etc/ovs-agent/db/server
+rm /etc/ovs-agent/db/repository
+rm /etc/ocfs2/cluster.conf
+/etc/init.d/ovs-agent restart
+/etc/init.d/ocfs2 restart
+for i in `mount | grep cs-mgmt | awk '{ print $1 }'`
+do
+ umount $i
+done
+
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/scripts/create_pool_cluster.py
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/scripts/create_pool_cluster.py b/plugins/hypervisors/ovm3/scripts/create_pool_cluster.py
new file mode 100755
index 0000000..15c9a97
--- /dev/null
+++ b/plugins/hypervisors/ovm3/scripts/create_pool_cluster.py
@@ -0,0 +1,271 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+import os, sys, subprocess
+from xml.dom.minidom import parseString
+
+from xmlrpclib import ServerProxy, Error
+
+server = ServerProxy("http://localhost:8899")
+
+pooledFs = 1
+normalRepo = 0
+
+try:
+ if normalRepo:
+ print "normal repo"
+ # this litterally throws EVERYTHING away on the repo
+ repoDom = parseString(server.discover_repository_db())
+ for node in repoDom.getElementsByTagName('Repository'):
+ repoUuid = node.attributes['Uuid']
+ remoteMount = node.getElementsByTagName('Fs_location')[0].firstChild.nodeValue
+ localMount = node.getElementsByTagName('Mount_point')[0].firstChild.nodeValue
+
+ # there is a "strong" relation between repo's and VMs
+ # onfortunately there is no reference in the vm.cfg
+ # or any known info in the configuration of the VM
+ # in which repo it lives....
+ for dirname, dirnames, filenames in os.walk('%s/VirtualMachines/' % localMount):
+ for vm in dirnames:
+ print "Destroying vm: %s on repo %s" % (vm, repoUuid.value)
+ try:
+ mVm = server.list_vm(repoUuid.value, vm)
+ if mVm != None:
+ print server.stop_vm(repoUuid.value, vm)
+ print server.delete_vm(repoUuid.value, vm)
+ else:
+ print "%s already not in repo %s" % (repoUuid.value, vm)
+ except Error, v:
+ print "Unable to destroy: %s" % (v)
+ continue
+
+ # VMs = server.list_vms()
+ # for vm in VMs:
+ # if vm['domid'] != '0':
+ # print vm
+ # print server.delete_vm(repoUuid.value, vm['uuid'])
+
+ rc = server.delete_repository(repoUuid.value, True)
+ # Set to false if you want to keep data: ^^^^
+ print "Repository: %s" % repoUuid.value
+ if (rc == None):
+ print "Ok repo: %s destroyed!" % repoUuid.value
+ # now unmount the FS
+ # print server.unmount_repository_fs(localMount)
+ else:
+ print "Failed repo: %s not destroyed!" % repoUuid.value
+
+ # for now only treat NFS stuff as we're testing with that..
+ nfsHost='cs-mgmt'
+ nfsDom = server.storage_plugin_listMountPoints(
+ 'oracle.generic.NFSPlugin.GenericNFSPlugin',
+ { 'status': '',
+ 'admin_user': '',
+ 'admin_host': '',
+ 'uuid': '',
+ 'total_sz': 0,
+ 'admin_passwd': '',
+ 'free_sz': 0,
+ 'name': '',
+ 'access_host': nfsHost,
+ 'storage_type': 'FileSys',
+ 'alloc_sz': 0,
+ 'access_grps': [],
+ 'used_sz': 0,
+ 'storage_desc': ''
+ })
+ for node in nfsDom:
+ props = {'status': node['status'],
+ 'uuid': '',
+ 'access_host': nfsHost,
+ 'storage_type': 'FileSys',
+ 'name': '' }
+ extprops = {'status': node['status'],
+ 'uuid': node['fs_uuid'],
+ 'ss_uuid': '',
+ 'size': 0,
+ 'free_sz': '',
+ 'state': 1,
+ 'access_grp_names': [],
+ 'access_path': nfsHost + ':' + '/volumes/cs-data/secondary',
+ 'name': ''}
+ # rc = server.storage_plugin_unmount('oracle.generic.NFSPlugin.GenericNFSPlugin', props, extprops, nfsMnt, True)
+ # print rc
+
+ nfsDom = parseString(server.discover_mounted_file_systems('nfs'))
+ for node in nfsDom.getElementsByTagName('Mount'):
+ nfsMnt = node.attributes['Dir'].value
+ print 'Mountpoint: %s' % (nfsMnt)
+ fsStamp = '%s/.generic_fs_stamp' % nfsMnt
+ # remove this so we don't cock up next run
+ if os.path.isfile(fsStamp):
+ print "Stamp found: %s" % fsStamp
+ os.unlink(fsStamp)
+
+ rc = server.storage_plugin_unmount('oracle.generic.NFSPlugin.GenericNFSPlugin', props, extprops, nfsMnt, True)
+ print rc
+
+
+ if pooledFs:
+ print "pooling"
+ # pool stuff
+ poolalias="ItsMyPool"
+ poolmvip="192.168.1.161"
+ poolfirsthost = {
+ 'ip': "192.168.1.64",
+ 'hn': "ovm-1",
+ 'id': 0,
+ 'role': 'utility,xen'
+ }
+ fstype="nfs"
+ fstarget="cs-mgmt:/volumes/cs-data/primary"
+ poolid="0004fb0000020000ba9aaf00ae5e2d73"
+ clusterid="ba9aaf00ae5e2d72"
+ poolfsuuid="0004fb0000050000e70fbddeb802208f"
+ poolfsnfsbaseuuid="b8ca41cb-3469-4f74-a086-dddffe37dc2d"
+ manageruuid="0004fb00000100000af70d20dcce7d65"
+ pooluuid="0004fb0000020000ba9aaf00ae5e2d73"
+ blocksize=""
+ clustersize=""
+ journalesize=""
+
+ # o2cb is the problem.... /etc/init.d/o2cb
+ # sets it's config in /etc/sysconfig/o2cb (can be removed)
+ # dmsetup requires the stopping of o2cb first,
+ # then the removal of the config, after which dmsetup
+ # can remove the device from /dev/mapper/
+ # eventually cluster cleanup can be done by removing
+ # stuff from /etc/ovs-agent/db
+ # also clean /etc/ocfs2/cluster.conf
+ print server.create_pool_filesystem(
+ fstype,
+ fstarget,
+ clusterid,
+ poolfsuuid,
+ poolfsnfsbaseuuid,
+ manageruuid,
+ pooluuid
+ )
+
+ # poolDom = server.discover_server_pool()
+ # print poolDom
+ # poolDom = parseString(server.discover_server_pool())
+ # if poolDom.getElementsByTagName('Server_Pool'):
+ # get unique id
+ cluster = server.is_cluster_online()
+ if cluster == True:
+ print "clean up pool"
+ # print server.destroy_cluster(poolfsuuid)
+ # deconfigure cluster
+ # print server.destroy_server_pool(poolid)
+
+ if cluster == False:
+ print "create_server_pool"
+ # first take ownership. without an owner nothing happens
+ print server.take_ownership(manageruuid, "")
+ # we need to add the first host first to the pool....
+ poolDom = server.discover_server_pool()
+ print poolDom
+ poolDom = parseString(server.discover_server_pool())
+ if poolDom.getElementsByTagName('Server_Pool'):
+ print server.destroy_server_pool(pooluuid)
+
+ print server.create_pool_filesystem(
+ fstype,
+ fstarget,
+ clusterid,
+ poolfsuuid,
+ poolfsnfsbaseuuid,
+ manageruuid,
+ pooluuid
+ )
+ print server.create_server_pool(poolalias,
+ pooluuid,
+ poolmvip,
+ poolfirsthost['id'],
+ poolfirsthost['hn'],
+ poolfirsthost['ip'],
+ poolfirsthost['role'])
+
+ print "configure_virtual_ip"
+ server.configure_virtual_ip(poolmvip, poolfirsthost['ip'])
+ server.set_pool_member_ip_list(['192.168.1.64','192.168.1.65'],)
+ print "configure for cluster"
+ server.configure_server_for_cluster(
+ {
+ 'O2CB_HEARTBEAT_THRESHOLD': '61',
+ 'O2CB_RECONNECT_DELAY_MS': '2000',
+ 'O2CB_KEEPALIVE_DELAY_MS': '2000',
+ 'O2CB_BOOTCLUSTER': clusterid,
+ 'O2CB_IDLE_TIMEOUT_MS': '60000',
+ 'O2CB_ENABLED': 'true',
+ 'O2CB_STACK': 'o2cb'
+ },
+ {
+ 'node': [
+ {
+ 'ip_port': 7777,
+ 'cluster': clusterid,
+ 'ip_address': poolfirsthost['ip'],
+ 'name': poolfirsthost['hn'],
+ 'number': poolfirsthost['id']
+ }
+ ],
+ 'heartbeat': [
+ {
+ 'cluster': clusterid,
+ # uppercase poolfsuuid
+ 'region': '0004FB0000050000E70FBDDEB802208F'
+ }
+ ],
+ 'cluster': [
+ {
+ 'heartbeat_mode': 'global',
+ 'node_count': 1,
+ 'name': clusterid
+ }
+ ]
+ },
+ 'nfs',
+ 'cs-mgmt:/volumes/cs-data/primary',
+ poolfsuuid,
+ poolfsnfsbaseuuid
+ )
+ print "create cluster"
+ server.create_cluster(poolfsuuid,)
+
+ poolDom = parseString(server.discover_server_pool())
+ for node in poolDom.getElementsByTagName('Server_Pool'):
+ id = node.getElementsByTagName('Unique_Id')[0].firstChild.nodeValue
+ alias = node.getElementsByTagName('Pool_Alias')[0].firstChild.nodeValue
+ mvip = node.getElementsByTagName('Master_Virtual_Ip')[0].firstChild.nodeValue
+ print "pool: %s, %s, %s" % (id, mvip, alias)
+ members = node.getElementsByTagName('Member')
+ for member in members:
+ mip = member.getElementsByTagName('Registered_IP')[0].firstChild.nodeValue
+ print "member: %s" % (mip)
+
+ print server.is_cluster_online()
+ print server.discover_cluster()
+ print server.discover_pool_filesystem()
+ print server.discover_server_pool()
+ # server.destroy_server_pool(pooluuid)
+
+except Error, v:
+ print "ERROR", v
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/scripts/info.py
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/scripts/info.py b/plugins/hypervisors/ovm3/scripts/info.py
new file mode 100755
index 0000000..518aaf1
--- /dev/null
+++ b/plugins/hypervisors/ovm3/scripts/info.py
@@ -0,0 +1,111 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+import os, sys, subprocess, socket,fcntl, struct
+from socket import gethostname
+import errno
+from socket import error as socket_error
+from xml.dom.minidom import parseString
+
+from xmlrpclib import ServerProxy, Error
+
+def spCon(proto, auth, host, port):
+ print "trying %s on %s@%s:%s" % (proto, auth, host, port)
+ try:
+ x=ServerProxy("%s://%s@%s:%s" % (proto, auth, host, port))
+ x.echo(proto)
+ return x
+ except Error, v:
+ return
+ except socket_error, serr:
+ return
+
+def getCon(auth, host, port):
+ try:
+ server = spCon("http", auth, host, port)
+ if server:
+ return server
+ else:
+ server = spCon("https", auth, host, port)
+ except Error, v:
+ print "ERROR", v
+ return server
+
+def get_ip_address(ifname):
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ return socket.inet_ntoa(fcntl.ioctl(
+ s.fileno(),
+ 0x8915, # SIOCGIFADDR
+ struct.pack('256s', ifname[:15])
+ )[20:24])
+
+def is_it_up(host, port):
+ try:
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ s.settimeout(1)
+ s.connect((host, port))
+ s.close()
+ except:
+ print "host: %s:%s DOWN" % (host, port)
+ return False
+
+ print "host: %s:%s UP" % (host, port)
+ return True
+
+# hmm master actions don't apply to a slave
+master="192.168.1.161"
+port=8899
+user = "oracle"
+password = "test123"
+auth = "%s:%s" % (user, password)
+server = getCon(auth, 'localhost', port)
+mserver = getCon(auth, master, port)
+poolNode=True
+interface = "c0a80100"
+role='xen,utility'
+hostname=gethostname()
+ip = get_ip_address(interface)
+poolMembers = []
+xserver = server
+poolCount = 0
+
+try:
+ print server.discover_pool_filesystem()
+ print
+ print server.discover_server_pool()
+ poolDom = parseString(server.discover_server_pool())
+ for node in poolDom.getElementsByTagName('Server_Pool'):
+ id = node.getElementsByTagName('Unique_Id')[0].firstChild.nodeValue
+ alias = node.getElementsByTagName('Pool_Alias')[0].firstChild.nodeValue
+ mvip = node.getElementsByTagName('Master_Virtual_Ip')[0].firstChild.nodeValue
+ print "pool: %s, %s, %s" % (id, mvip, alias)
+ members = node.getElementsByTagName('Member')
+ for member in members:
+ poolCount = poolCount + 1
+ mip = member.getElementsByTagName('Registered_IP')[0].firstChild.nodeValue
+ print "member: %s" % (mip)
+ if mip == ip:
+ pooled = True
+ else:
+ poolMembers.append(mip)
+
+ # print server.discover_server()
+
+except Error, v:
+ print "ERROR", v
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/scripts/ovs_agent_plugin/cloudstack.py
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/scripts/ovs_agent_plugin/cloudstack.py b/plugins/hypervisors/ovm3/scripts/ovs_agent_plugin/cloudstack.py
new file mode 100644
index 0000000..f655760
--- /dev/null
+++ b/plugins/hypervisors/ovm3/scripts/ovs_agent_plugin/cloudstack.py
@@ -0,0 +1,344 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+import logging
+import time
+import re
+import os.path
+import paramiko
+import subprocess
+import socket
+
+from xen.util.xmlrpcclient import ServerProxy
+from xmlrpclib import Error
+from xen.xend import XendClient
+from agent.api.base import Agent
+from agent.lib.settings import get_api_version
+from xen.xend import sxp
+
+class CloudStack(Agent):
+ """
+ Cloudstack plugin for OVM3.2.x.
+ """
+
+ # exposed services
+ def get_services(self, version=None):
+ return {
+ 'call': call,
+ 'get_vncport': getVncPort,
+ 'exec_domr': domrExec,
+ 'check_domr_port': domrCheckPort,
+ 'check_domr_ssh': domrCheckSsh,
+ 'ovs_control_interface': ovsControlInterface,
+ 'ovs_mkdir': ovsMkdir,
+ 'ovs_check_file': ovsCheckFile,
+ 'ovs_upload_ssh_key': ovsUploadSshKey,
+ 'ovs_dom0_stats': ovsDom0Stats,
+ 'ovs_domU_stats': ovsDomUStats,
+ 'get_module_version': getModuleVersion,
+ 'ping': ping,
+# 'ovs_agent_set_ssl': ovsAgentSetSsl,
+# 'ovs_agent_set_port': ovsAgentSetPort,
+# 'ovs_restart_agent': ovsRestartAgent,
+ }
+
+ def getName(self):
+ return self.__class__.__name__
+
+# which version are we intended for?
+def getModuleVersion():
+ return "0.1"
+
+# call test
+def call(msg):
+ return msg
+
+# execute something on domr
+def domrExec(ip, cmd, timeout=10, username="root", port=3922, keyfile="~/.ssh/id_rsa.cloud"):
+ ssh = paramiko.SSHClient()
+ ssh.load_system_host_keys()
+ ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ privatekeyfile = os.path.expanduser(keyfile)
+ key = paramiko.RSAKey.from_private_key_file(privatekeyfile)
+ ssh.connect(ip, port, username, pkey=key, timeout=timeout)
+ ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd)
+ exit_status = ssh_stdout.channel.recv_exit_status()
+ ssh.close()
+ return { "rc": exit_status,
+ "out": ''.join(ssh_stdout.readlines()),
+ "err": ''.join(ssh_stderr.readlines()) };
+
+# check a port on domr
+def domrPort(ip, port=3922, timeout=3):
+ return domrCheckPort(ip, port, timeout=timeout)
+
+# check a port on domr
+def domrCheckPort(ip, port=3922, timeout=3):
+ try:
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ s.settimeout(timeout)
+ s.connect((ip, port))
+ s.close()
+ return True
+ except:
+ return False
+
+# check ssh
+def domrCheckSsh(ip, port=3922, timeout=10):
+ x = domrExec(ip, "", port=port, timeout=timeout)
+ if (x.get("rc") == 0):
+ return True
+ return False
+
+def _ovsIni(setting, set):
+ ini="/etc/ovs-agent/agent.ini"
+ replaced=False
+ if os.path.isfile(ini):
+ import fileinput
+ for line in fileinput.FileInput(ini, inplace=1):
+ line=line.rstrip('\n')
+ if re.search("%s=" % setting, line):
+ line="%s=%s" % (setting, set)
+ replaced=True
+ print line
+ return replaced
+
+# enable/disable ssl for the agent
+def ovsAgentSetSsl(state):
+ ena="disable"
+ if state and state != "disable" and state.lower() != "false":
+ ena="enable"
+ return _ovsIni("ssl", ena)
+
+def ovsAgentSetPort(port):
+ return _ovsIni("port", port)
+
+def ovsRestartAgent():
+ return restartService("ovs-agent")
+
+# replace with popen
+def restartService(service):
+ command = ['service', service, 'restart'];
+ subprocess.call(command, shell=False)
+ return True
+
+# sets the control interface and removes the route net entry
+def ovsControlInterface(dev, ipmask):
+ command = ['route', 'del', '-net', ipmask];
+ subprocess.call(command, shell=False)
+ command = ['ifconfig', dev, 'arp']
+ subprocess.call(command, shell=False)
+ return True
+
+# create a dir if we need it
+def ovsMkdir(dir, mode=0700):
+ if not os.path.exists(dir):
+ return os.makedirs(dir, mode)
+ return True
+
+# if a file exists, easy
+def ovsCheckFile(file):
+ if os.path.isfile(file):
+ return True
+ return False
+
+# upload keys
+def ovsUploadSshKey(keyfile, content):
+ keydir=os.path.expanduser("~/.ssh")
+ key="%s/%s" % (keydir, keyfile)
+ try:
+ ovsMkdir(os.path.expanduser(keydir))
+ except Error, v:
+ print "was already there %s" % keydir
+
+ try:
+ text_file = open("%s" % key, "w")
+ text_file.write("%s" % content)
+ text_file.close()
+ except Error, v:
+ print "something went wrong %s" % v
+ return False
+ return True
+
+
+# older python,
+def ovsDom0Stats(bridge):
+ stats={}
+ stats['cpu'] = "%s" % (100 - float(os.popen("top -b -n 1 | grep Cpu\(s\): | cut -d% -f4|cut -d, -f2").read()))
+ stats['free'] = "%s" % (1048576 * int(os.popen("xm info | grep free_memory | awk '{ print $3 }'").read()))
+ stats['total'] = "%s" % (1048576 * int(os.popen("xm info | grep total_memory | awk '{ print $3 }'").read()))
+ stats['tx'] = os.popen("netstat -in | grep %s | head -1 | awk '{print $4 }'" % bridge).read()
+ stats['rx'] = os.popen("netstat -in | grep %s | head -1 | awk '{print $8 }'" % bridge).read()
+ return stats
+
+def getVncPort(domain):
+ port = "0"
+ if re.search("\w-(\d+-)?\d+-VM", domain):
+ server=ServerProxy(XendClient.uri)
+ dom=server.xend.domain(domain, 1)
+ devices = [child for child in sxp.children(dom)
+ if len(child) > 0 and child[0] == "device"]
+ vfbs_sxp = map(lambda x: x[1], [device for device in devices
+ if device[1][0] == "vfb"])[0]
+ loc=[child for child in vfbs_sxp
+ if child[0] == "location"][0][1]
+ listner, port = loc.split(":")
+ else:
+ print "no valid domain: %s" % domain
+ return port
+
+def get_child_by_name(exp, childname, default = None):
+ try:
+ return [child for child in sxp.children(exp)
+ if child[0] == childname][0][1]
+ except:
+ return default
+
+def ovsDomUStats(domain):
+ _rd_bytes=0
+ _wr_bytes=0
+ _rd_ops=0
+ _wr_ops=0
+ _tx_bytes=0
+ _rx_bytes=0
+ stats={}
+ server=ServerProxy(XendClient.uri)
+ dominfo=server.xend.domain(domain, 1)
+ domid=get_child_by_name(dominfo, "domid")
+
+ # vbds
+ devs = server.xend.domain.getDeviceSxprs(domain, 'vbd')
+ devids = [dev[0] for dev in devs]
+ for dev in devids:
+ sys_path="/sys/devices/%s-%s-%s/statistics" % ("vbd", domid, dev)
+ _rd_bytes += long(open("%s/rd_sect" % sys_path).readline().strip())
+ _wr_bytes += long(open("%s/wr_sect" % sys_path).readline().strip())
+ _rd_ops += long(open("%s/rd_req" % sys_path).readline().strip())
+ _wr_ops += long(open("%s/wr_req" % sys_path).readline().strip())
+
+ # vifs
+ devs = server.xend.domain.getDeviceSxprs(domain, 'vif')
+ devids = [dev[0] for dev in devs]
+ for dev in devids:
+ vif="vif%s.%s" % (domid, dev)
+ sys_path="/sys/devices/%s-%s-%s/net/%s/statistics" % ("vif", domid, dev, vif)
+ _tx_bytes += long(open("%s/tx_bytes" % sys_path).readline().strip())
+ _rx_bytes += long(open("%s/rx_bytes" % sys_path).readline().strip())
+
+ epoch=time.time()
+ stats['rd_bytes'] = "%s" % (_rd_bytes * 512)
+ stats['wr_bytes'] = "%s" % (_wr_bytes * 512)
+ stats['rd_ops'] = "%s" % (_rd_ops)
+ stats['wr_ops'] = "%s" % (_wr_ops)
+ stats['tx_bytes'] = "%s" % (_tx_bytes)
+ stats['rx_bytes'] = "%s" % (_rx_bytes)
+ stats['cputime']= "%s" % get_child_by_name(dominfo, "cpu_time")
+ stats['uptime']= "%s" % (epoch - get_child_by_name(dominfo, "start_time"))
+ stats['vcpus']= "%s" % get_child_by_name(dominfo, "online_vcpus")
+ return stats
+
+def ping(host, count=3):
+ if os.system("ping -c %s %s " % (count, host)) == 0:
+ return True
+ return False
+
+# add SystemVM stuff here....
+#
+
+#
+# Self deploy and integration, not de-integration
+# should return False if fails
+#
+# install us if we are missing in:
+# /usr/lib64/python2.4/site-packages/agent/api
+# and add our hooks in:
+# /usr/lib64/python2.4/site-packages/agent/target/api.py
+if __name__ == '__main__':
+ from distutils.sysconfig import get_python_lib
+ from agent.target.api import MODULES
+ from shutil import copyfile
+ import inspect, os, hashlib, getopt, sys
+
+ # default vars
+ exist=False
+ agentpath="%s/agent" % (get_python_lib(1))
+ api="%s/target/api.py" % (agentpath)
+ modpath="%s/api" % (agentpath)
+ ssl="disable"
+ port=0
+
+ # get options
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], "sp::",
+ [ 'port=','ssl='])
+ except getopt.GetoptError:
+ print "Available Options: --port=, --ssl="
+ sys.exit()
+
+ for o, a in opts:
+ if o in ('-s', '--ssl'):
+ ssl = a
+ if o in ('-p', '--port'):
+ port = int(a)
+
+ # check if we're in the modules already
+ cs = CloudStack()
+ for mod in MODULES:
+ if re.search(cs.getName(), "%s" % (mod)):
+ exist=True
+
+ # if we're not:
+ if not exist:
+ if os.path.isfile(api):
+ import fileinput
+ for line in fileinput.FileInput(api, inplace=1):
+ line=line.rstrip('\n')
+ if re.search("import common", line):
+ line="%s, cloudstack" % (line)
+ if re.search("MODULES", line):
+ n=cs.getName()
+ line="%s\n\t%s.%s," % (line, n.lower(), n)
+ print line
+ print "Api inserted, %s in %s" % (cs.getName(), api)
+ else:
+ print "Api missing, %s" % (api)
+ else:
+ print "Api present, %s in %s" % (cs.getName(), api)
+
+ # either way check our version and install if checksum differs
+ modfile="%s/%s.py" % (modpath, cs.getName().lower())
+ me=os.path.abspath(__file__)
+ if os.path.isfile(modfile):
+ if hashlib.md5(open(me).read()).hexdigest() != hashlib.md5(open(modfile).read()).hexdigest():
+ print "Module copy, %s" % (modfile)
+ copyfile(me, modfile)
+ else:
+ print "Module correct, %s" % (modfile)
+ else:
+ print "Module copy, %s" % (modfile)
+ copyfile(me, modfile)
+
+ # setup ssl and port
+ if ssl:
+ ovsAgentSetSsl(ssl)
+ if port > 1024:
+ ovsAgentSetPort(port)
+
+ # restart either way
+ ovsRestartAgent()
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/scripts/password.py
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/scripts/password.py b/plugins/hypervisors/ovm3/scripts/password.py
new file mode 100755
index 0000000..25404a9
--- /dev/null
+++ b/plugins/hypervisors/ovm3/scripts/password.py
@@ -0,0 +1,57 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+import os, sys, subprocess, socket,fcntl, struct
+from socket import gethostname
+from xml.dom.minidom import parseString
+
+from xmlrpclib import ServerProxy, Error
+
+def spCon(proto, host, port):
+ print "trying %s on %s:%s" % (proto, host, port)
+ try:
+ x=ServerProxy("%s://%s:%s" % (proto, host, port))
+ x.echo(proto)
+ return x
+ except Error, v:
+ print "ERROR", v
+ return
+
+def getCon(host, port):
+ try:
+ server = spCon("http", host, port)
+ except Error, v:
+ print "ERROR", v
+ server = spCon("https", host, port)
+
+ return server
+
+# hmm master actions don't apply to a slave
+port=8899
+user = "oracle"
+password = "test123"
+auth = "%s:%s" % (user, password)
+host = "localhost"
+
+print "setting up password"
+try:
+ con = getCon(host, port)
+ print con.update_agent_password(user, password)
+except Error, v:
+ print "ERROR", v
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/scripts/repo_pool.py
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/scripts/repo_pool.py b/plugins/hypervisors/ovm3/scripts/repo_pool.py
new file mode 100755
index 0000000..71feca8
--- /dev/null
+++ b/plugins/hypervisors/ovm3/scripts/repo_pool.py
@@ -0,0 +1,186 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+import os, sys, subprocess, socket,fcntl, struct
+from socket import gethostname
+from xml.dom.minidom import parseString
+
+from xmlrpclib import ServerProxy, Error
+
+def get_ip_address(ifname):
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ return socket.inet_ntoa(fcntl.ioctl(
+ s.fileno(),
+ 0x8915, # SIOCGIFADDR
+ struct.pack('256s', ifname[:15])
+ )[20:24])
+
+def is_it_up(host, port):
+ try:
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ s.settimeout(1)
+ s.connect((host, port))
+ s.close()
+ except:
+ print "host: %s:%s DOWN" % (host, port)
+ return False
+
+ print "host: %s:%s UP" % (host, port)
+ return True
+
+# hmm master actions don't apply to a slave
+master="192.168.1.161"
+port=8899
+user = "oracle"
+password = "*******"
+auth = "%s:%s" % (user, password)
+server = ServerProxy("http://%s:%s" % ("localhost", port))
+mserver = ServerProxy("http://%s@%s:%s" % (auth, master, port))
+poolNode=True
+interface = "c0a80100"
+role='xen,utility'
+hostname=gethostname()
+ip = get_ip_address(interface)
+poolMembers = []
+xserver = server
+
+print "setting up password"
+server.update_agent_password(user, password)
+
+if (is_it_up(master, port)):
+ print "master seems to be up, slaving"
+ xserver = mserver
+else:
+ print "no master yet, will become master"
+
+# other mechanism must be used to make interfaces equal...
+try:
+ # pooling related same as primary storage!
+ poolalias="Pool 0"
+ poolid="0004fb0000020000ba9aaf00ae5e2d73"
+ poolfsnfsbaseuuid="7718562d-872f-47a7-b454-8f9cac4ffa3a"
+ pooluuid=poolid
+ poolfsuuid=poolid
+ clusterid="ba9aaf00ae5e2d72"
+ mgr="d1a749d4295041fb99854f52ea4dea97"
+ poolmvip=master
+
+ poolfsnfsbaseuuid="6824e646-5908-48c9-ba44-bb1a8a778084"
+ repoid="6824e646590848c9ba44bb1a8a778084"
+ poolid=repoid
+ repo="/OVS/Repositories/%s" % (repoid)
+ repomount="cs-mgmt:/volumes/cs-data/secondary"
+
+ # primary
+ primuuid="7718562d872f47a7b4548f9cac4ffa3a"
+ ssuuid="7718562d-872f-47a7-b454-8f9cac4ffa3a"
+ fshost="cs-mgmt"
+ fstarget="/volumes/cs-data/primary"
+ fstype="nfs"
+ fsname="Primary storage"
+ fsmntpoint="%s:%s" % (fshost, fstarget)
+ fsmnt="/nfsmnt/%s" % (ssuuid)
+ fsplugin="oracle.generic.NFSPlugin.GenericNFSPlugin"
+
+ # set the basics we require to "operate"
+ print server.take_ownership(mgr, '')
+ print server.update_server_roles(role,)
+
+ # if we're pooling pool...
+ if (poolNode == True):
+ poolCount = 0
+ pooled = False
+
+ # check pooling
+ try:
+ poolDom = parseString(xserver.discover_server_pool())
+ print xserver.discover_server_pool()
+ for node in poolDom.getElementsByTagName('Server_Pool'):
+ id = node.getElementsByTagName('Unique_Id')[0].firstChild.nodeValue
+ alias = node.getElementsByTagName('Pool_Alias')[0].firstChild.nodeValue
+ mvip = node.getElementsByTagName('Master_Virtual_Ip')[0].firstChild.nodeValue
+ print "pool: %s, %s, %s" % (id, mvip, alias)
+ members = node.getElementsByTagName('Member')
+ for member in members:
+ poolCount = poolCount + 1
+ mip = member.getElementsByTagName('Registered_IP')[0].firstChild.nodeValue
+ print "member: %s" % (mip)
+ if mip == ip:
+ pooled = True
+ else:
+ poolMembers.append(mip)
+
+ except Error,v:
+ print "no master will become master, %s" % v
+
+ if (pooled == False):
+ # setup the repository
+ print "setup repo"
+ print server.mount_repository_fs(repomount, repo)
+ try:
+ print "adding repo"
+ print server.add_repository(repomount, repo)
+ except Error, v:
+ print "will create the repo, as it's not there", v
+ print server.create_repository(repomount, repo, repoid, "repo")
+
+ print "not pooled!"
+ if (poolCount == 0):
+ print "no pool yet, create it"
+ # check if a pool exists already if not create
+ # pool if so add us to the pool
+ print "create pool fs"
+ print server.create_pool_filesystem(
+ fstype,
+ "%s/VirtualMachines/" % repomount,
+ clusterid,
+ poolfsuuid,
+ poolfsnfsbaseuuid,
+ mgr,
+ pooluuid
+ )
+ print "create pool"
+ print server.create_server_pool(poolalias,
+ pooluuid,
+ poolmvip,
+ poolCount,
+ hostname,
+ ip,
+ role
+ )
+ else:
+ print "join the pool"
+ print server.join_server_pool(poolalias,
+ pooluuid,
+ poolmvip,
+ poolCount,
+ hostname,
+ ip,
+ role
+ )
+
+ # add member to ip list ?
+ poolMembers.append(ip)
+ print "mambers for pool: %s" % poolMembers
+ print xserver.set_pool_member_ip_list(poolMembers)
+
+ print server.discover_server_pool()
+
+except Error, v:
+ print "ERROR", v
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/scripts/simple_pool.py
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/scripts/simple_pool.py b/plugins/hypervisors/ovm3/scripts/simple_pool.py
new file mode 100755
index 0000000..756de93
--- /dev/null
+++ b/plugins/hypervisors/ovm3/scripts/simple_pool.py
@@ -0,0 +1,209 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+import os, sys, subprocess, socket,fcntl, struct
+from socket import gethostname
+from xml.dom.minidom import parseString
+import errno
+from socket import error as socket_error
+
+from xmlrpclib import ServerProxy, Error
+
+def spCon(proto, auth, host, port):
+ print "trying %s on %s@%s:%s" % (proto, auth, host, port)
+ try:
+ x=ServerProxy("%s://%s@%s:%s" % (proto, auth, host, port))
+ x.echo(proto)
+ return x
+ except Error, v:
+ return
+ except socket_error, serr:
+ return
+
+def getCon(auth, host, port):
+ try:
+ server = spCon("http", auth, host, port)
+ if server:
+ return server
+ else:
+ server = spCon("https", auth, host, port)
+ except Error, v:
+ print "ERROR", v
+ return server
+
+def get_ip_address(ifname):
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ return socket.inet_ntoa(fcntl.ioctl(
+ s.fileno(),
+ 0x8915, # SIOCGIFADDR
+ struct.pack('256s', ifname[:15])
+ )[20:24])
+
+# hmm master actions don't apply to a slave
+master="192.168.1.161"
+port=8899
+passw='test123'
+user='oracle'
+auth="%s:%s" % (user, passw)
+server = getCon(auth, "localhost", port)
+mserver = getCon(auth, master, port)
+try:
+ mserver.echo("test")
+except AttributeError, v:
+ print "no mserver, becoming mserver"
+ mserver=server
+
+poolNode=True
+interface = "c0a80100"
+role='xen,utility'
+hostname=gethostname()
+ip = get_ip_address(interface)
+nodes=[]
+
+try:
+ # pooling related same as primary storage!
+ poolalias="Pool 0"
+ clusterid="ba9aaf00ae5e2d72"
+ mgr="d1a749d4295041fb99854f52ea4dea97"
+ poolmvip=master
+
+ # primary
+ primuuid="7718562d872f47a7b4548f9cac4ffa3a"
+ ssuuid="7718562d-872f-47a7-b454-8f9cac4ffa3a"
+ fshost="cs-mgmt"
+ fstarget="/volumes/cs-data/primary/ovm"
+ fstype="nfs"
+ fsname="Primary storage"
+ fsmntpoint="%s:%s" % (fshost, fstarget)
+ fsmntpoint2="%s:%s" % (fshost, "/volumes/cs-data/secondary")
+ fsmntpoint="%s/VirtualMachines" % (fsmntpoint2)
+ fsmnt="/nfsmnt/%s" % (ssuuid)
+ fsplugin="oracle.generic.NFSPlugin.GenericNFSPlugin"
+ repo="/OVS/Repositories/%s" % (primuuid)
+
+ # set the basics we require to "operate"
+ print server.take_ownership(mgr, '')
+ print server.update_server_roles(role,)
+
+ # setup the repository
+ print server.mount_repository_fs(fsmntpoint2, repo)
+ try:
+ print server.add_repository(fsmntpoint2, repo)
+ except Error, v:
+ print "will create the repo, as it's not there", v
+ print server.create_repository(fsmntpoint2, repo, primuuid, "A repository")
+
+ # if we're pooling pool...
+ if (poolNode == True):
+ poolCount = 0
+ pooled = False
+
+ # check pooling
+ poolDom = parseString(mserver.discover_server_pool())
+ for node in poolDom.getElementsByTagName('Server_Pool'):
+ id = node.getElementsByTagName('Unique_Id')[0].firstChild.nodeValue
+ alias = node.getElementsByTagName('Pool_Alias')[0].firstChild.nodeValue
+ mvip = node.getElementsByTagName('Master_Virtual_Ip')[0].firstChild.nodeValue
+ print "pool: %s, %s, %s" % (id, mvip, alias)
+ members = node.getElementsByTagName('Member')
+ for member in members:
+ poolCount = poolCount + 1
+ mip = member.getElementsByTagName('Registered_IP')[0].firstChild.nodeValue
+ if (mip == ip):
+ pooled = True
+ else:
+ nodes.append(mip)
+ print "member: %s" % (mip)
+
+ # if (pooled == False):
+ try:
+ if (poolCount == 0):
+ print "master"
+ # check if a pool exists already if not create
+ # pool if so add us to the pool
+ print server.configure_virtual_ip(master, ip)
+ print server.create_pool_filesystem(
+ fstype,
+ fsmntpoint,
+ clusterid,
+ primuuid,
+ ssuuid,
+ mgr,
+ primuuid
+ )
+ print server.create_server_pool(poolalias,
+ primuuid,
+ poolmvip,
+ poolCount,
+ hostname,
+ ip,
+ role
+ )
+ else:
+ try:
+ print "slave"
+ print server.join_server_pool(poolalias,
+ primuuid,
+ poolmvip,
+ poolCount,
+ hostname,
+ ip,
+ role
+ )
+ except Error, v:
+ print "host already part of pool?: %s" % (v)
+
+ nodes.append(ip)
+ for node in nodes:
+ # con = getCon(auth, node, port)
+ # print con.set_pool_member_ip_list(nodes);
+ print mserver.dispatch("http://%s@%s:%s/api/3" % (auth, node, port), "set_pool_member_ip_list", nodes)
+ # print server.configure_virtual_ip(master, ip)
+ except Error, e:
+ print "something went wrong: %s" % (e)
+
+ # sys.exit()
+ # mount the primary fs
+ print server.storage_plugin_mount(
+ fsplugin,
+ {
+ 'uuid': primuuid,
+ 'storage_desc': fsname,
+ 'access_host': fshost,
+ 'storage_type': 'FileSys',
+ 'name':primuuid
+ },
+ {
+ 'status': '',
+ 'uuid': ssuuid,
+ 'ss_uuid': primuuid,
+ 'size': 0,
+ 'state': 1,
+ 'access_grp_names': [],
+ 'access_path': fsmntpoint,
+ 'name': fsname
+ },
+ fsmnt,
+ '',
+ True,
+ []
+ )
+
+except Error, v:
+ print "ERROR", v
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/scripts/socat.sh
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/scripts/socat.sh b/plugins/hypervisors/ovm3/scripts/socat.sh
new file mode 100755
index 0000000..c3fbc44
--- /dev/null
+++ b/plugins/hypervisors/ovm3/scripts/socat.sh
@@ -0,0 +1,2 @@
+CERT="/etc/ovs-agent/cert"
+socat OPENSSL-LISTEN:8899,reuseaddr,fork,verify=0,key=$CERT/key.pem,cert=$CERT/certificate.pem TCP:localhost:8898 &
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/scripts/tail.sh
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/scripts/tail.sh b/plugins/hypervisors/ovm3/scripts/tail.sh
new file mode 100755
index 0000000..fe88bc0
--- /dev/null
+++ b/plugins/hypervisors/ovm3/scripts/tail.sh
@@ -0,0 +1,2 @@
+cd /var/log
+tail -f ovm-consoled.log devmon.log messages ovs-agent.log ovmwatch.log
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/src/com/cloud/ha/Ovm3Investigator.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/src/com/cloud/ha/Ovm3Investigator.java b/plugins/hypervisors/ovm3/src/com/cloud/ha/Ovm3Investigator.java
new file mode 100644
index 0000000..980fa1f
--- /dev/null
+++ b/plugins/hypervisors/ovm3/src/com/cloud/ha/Ovm3Investigator.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.cloud.ha;
+
+import java.util.List;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CheckOnHostCommand;
+import com.cloud.host.Host;
+import com.cloud.host.HostVO;
+import com.cloud.host.Status;
+import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.Hypervisor;
+import com.cloud.resource.ResourceManager;
+import com.cloud.utils.component.AdapterBase;
+
+@Local(value = Investigator.class)
+public class Ovm3Investigator extends AdapterBase implements Investigator {
+ private final static Logger s_logger = Logger.getLogger(Ovm3Investigator.class);
+ @Inject
+ HostDao _hostDao;
+ @Inject
+ AgentManager _agentMgr;
+ @Inject
+ ResourceManager _resourceMgr;
+
+ @Override
+ public Boolean isVmAlive(com.cloud.vm.VirtualMachine vm, Host host) {
+ Status status = isAgentAlive(host);
+ if (status == null) {
+ return null;
+ }
+ return status == Status.Up ? true : null;
+ }
+
+ @Override
+ public Status isAgentAlive(Host agent) {
+ if (agent.getHypervisorType() != Hypervisor.HypervisorType.Ovm3) {
+ return null;
+ }
+ CheckOnHostCommand cmd = new CheckOnHostCommand(agent);
+ List<HostVO> neighbors = _resourceMgr.listHostsInClusterByStatus(agent.getClusterId(), Status.Up);
+ for (HostVO neighbor : neighbors) {
+ if (neighbor.getId() == agent.getId() || neighbor.getHypervisorType() != Hypervisor.HypervisorType.Ovm3) {
+ continue;
+ }
+ try {
+ Answer answer = _agentMgr.easySend(neighbor.getId(), cmd);
+ if (answer != null) {
+ return answer.getResult() ? Status.Down : Status.Up;
+ }
+ } catch (Exception e) {
+ s_logger.debug("Failed to send command to host: " + neighbor.getId());
+ }
+ }
+
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Discoverer.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Discoverer.java b/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Discoverer.java
new file mode 100755
index 0000000..bd1d90d
--- /dev/null
+++ b/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Discoverer.java
@@ -0,0 +1,411 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.hypervisor.ovm3.hypervisor;
+
+import java.net.InetAddress;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.Listener;
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.AgentControlAnswer;
+import com.cloud.agent.api.AgentControlCommand;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+import com.cloud.host.Status;
+import com.cloud.agent.api.StartupCommand;
+import com.cloud.agent.api.StartupRoutingCommand;
+import com.cloud.configuration.Config;
+import com.cloud.dc.ClusterVO;
+import com.cloud.dc.dao.ClusterDao;
+import com.cloud.dc.ClusterDetailsDao;
+// import com.cloud.exception.DiscoveryException;
+import com.cloud.host.HostInfo;
+import com.cloud.host.HostVO;
+import com.cloud.host.Host;
+import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.hypervisor.ovm3.object.Linux;
+import com.cloud.hypervisor.ovm3.object.Connection;
+import com.cloud.resource.Discoverer;
+import com.cloud.resource.DiscovererBase;
+import com.cloud.resource.ResourceManager;
+import com.cloud.resource.ResourceStateAdapter;
+import com.cloud.resource.ServerResource;
+import com.cloud.resource.UnableDeleteHostException;
+import com.cloud.utils.db.QueryBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.ssh.SSHCmdHelper;
+
+@Local(value = Discoverer.class)
+public class Ovm3Discoverer extends DiscovererBase implements Discoverer,
+ Listener, ResourceStateAdapter {
+ private static final Logger s_logger = Logger
+ .getLogger(Ovm3Discoverer.class);
+ protected String _publicNetworkDevice;
+ protected String _privateNetworkDevice;
+ protected String _guestNetworkDevice;
+ protected String _storageNetworkDevice;
+ private String _ovsAgentPath = "/etc/ovs-agent/agent.ini";
+
+ @Inject
+ ClusterDao _clusterDao;
+ @Inject
+ ClusterDetailsDao _clusterDetailsDao;
+ @Inject
+ ResourceManager _resourceMgr;
+ @Inject
+ AgentManager _agentMgr;
+ @Inject
+ HostDao _hostDao = null;
+
+ @Override
+ public boolean configure(String name, Map<String, Object> params)
+ throws ConfigurationException {
+ super.configure(name, params);
+ /* these are in Config.java */
+ _publicNetworkDevice = _params.get(Config.Ovm3PublicNetwork.key());
+ _privateNetworkDevice = _params.get(Config.Ovm3PrivateNetwork.key());
+ _guestNetworkDevice = _params.get(Config.Ovm3GuestNetwork.key());
+ _storageNetworkDevice = _params.get(Config.Ovm3StorageNetwork.key());
+ _resourceMgr.registerResourceStateAdapter(this.getClass()
+ .getSimpleName(), this);
+ return true;
+ }
+
+ protected Ovm3Discoverer() {
+ }
+
+ @Override
+ public boolean stop() {
+ _resourceMgr.unregisterResourceStateAdapter(this.getClass()
+ .getSimpleName());
+ return super.stop();
+ }
+
+ private boolean checkIfExisted(String guid) {
+ QueryBuilder<HostVO> sc = QueryBuilder.create(HostVO.class);
+ sc.and(sc.entity().getGuid(), SearchCriteria.Op.EQ, guid);
+ sc.and(sc.entity().getHypervisorType(), SearchCriteria.Op.EQ,
+ HypervisorType.Ovm3);
+ List<HostVO> hosts = sc.list();
+ return !hosts.isEmpty();
+ }
+
+ @Override
+ public Map<? extends ServerResource, Map<String, String>> find(long dcId,
+ Long podId, Long clusterId, URI url, String username,
+ String password, List<String> hostTags)
+ throws CloudRuntimeException {
+ Connection c = null;
+
+ if (url.getScheme().equals("http") || url.getScheme().equals("https")) {
+ String msg = "Discovering " + url
+ + ": " + _params;
+ s_logger.debug(msg);
+ } else {
+ String msg = "urlString is not http(s) so we're not taking care of the discovery for this: "
+ + url;
+ s_logger.debug(msg);
+ throw new CloudRuntimeException(msg);
+ }
+
+ if (clusterId == null) {
+ String msg = "must specify cluster Id when add host";
+ s_logger.debug(msg);
+ throw new CloudRuntimeException(msg);
+ }
+
+ if (podId == null) {
+ String msg = "must specify pod Id when add host";
+ s_logger.debug(msg);
+ throw new CloudRuntimeException(msg);
+ }
+
+ ClusterVO cluster = _clusterDao.findById(clusterId);
+ if (cluster == null
+ || (cluster.getHypervisorType() != HypervisorType.Ovm3)) {
+ String msg = "invalid cluster id or cluster is not for Ovm3 hypervisors";
+ s_logger.info(msg);
+ throw new CloudRuntimeException(msg);
+ } else {
+ s_logger.info("cluster: " + cluster);
+ }
+
+ String agentUsername = _params.get("agentusername");
+ if (agentUsername == null) {
+ String msg = "Agent user name must be specified";
+ s_logger.info(msg);
+ throw new CloudRuntimeException(msg);
+ }
+
+ String agentPassword = _params.get("agentpassword");
+ if (agentPassword == null) {
+ String msg = "Agent password must be specified";
+ s_logger.info(msg);
+ throw new CloudRuntimeException(msg);
+ }
+
+ String agentPort = _params.get("agentport");
+ if (agentPort == null) {
+ String msg = "Agent port must be specified";
+ s_logger.info(msg);
+ throw new CloudRuntimeException(msg);
+ }
+
+ try {
+ String hostname = url.getHost();
+ /* port = url.getPort(); */
+
+ InetAddress ia = InetAddress.getByName(hostname);
+ String hostIp = ia.getHostAddress();
+ String guid = UUID.nameUUIDFromBytes(hostIp.getBytes()).toString();
+
+ if (checkIfExisted(guid)) {
+ String msg = "The host " + hostIp + " has been added before";
+ s_logger.debug(msg);
+ throw new CloudRuntimeException(msg);
+ }
+
+ s_logger.debug("Ovm3 discover is going to disover host having guid "
+ + guid);
+
+ ClusterVO clu = _clusterDao.findById(clusterId);
+ if (clu.getGuid() == null) {
+ clu.setGuid(UUID.randomUUID().toString());
+ }
+ _clusterDao.update(clusterId, clu);
+ Map<String, String> clusterDetails = _clusterDetailsDao
+ .findDetails(clusterId);
+ String ovm3vip = (clusterDetails.get("ovm3vip") == null) ? ""
+ : clusterDetails.get("ovm3vip");
+ String ovm3pool = (clusterDetails.get("ovm3pool") == null) ? "false"
+ : clusterDetails.get("ovm3pool");
+ String ovm3cluster = (clusterDetails.get("ovm3cluster") == null) ? "false"
+ : clusterDetails.get("ovm3cluster");
+
+ /* should perhaps only make this connect to the agent port ? */
+ com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(
+ hostIp, 22);
+ sshConnection.connect(null, 60000, 60000);
+ sshConnection = SSHCmdHelper.acquireAuthorizedConnection(hostIp,
+ username, password);
+ if (sshConnection == null) {
+ String msg = String.format("Cannot connect to Ovm3 host(IP=%1$s, username=%2$s, password=*******), discovery failed",
+ hostIp, username);
+ s_logger.warn(msg);
+ throw new CloudRuntimeException(msg);
+ }
+
+ Map<String, String> details = new HashMap<String, String>();
+ Ovm3ResourceBase ovmResource = new Ovm3ResourceBase();
+ details.put("ip", hostIp);
+ details.put("host", hostname);
+ details.put("username", username);
+ details.put("password", password);
+ details.put("zone", Long.toString(dcId));
+ details.put("guid", guid);
+ details.put("pod", Long.toString(podId));
+ details.put("cluster", Long.toString(clusterId));
+ details.put("agentusername", agentUsername);
+ details.put("agentpassword", agentPassword);
+ details.put("agentport", agentPort.toString());
+ details.put("ovm3vip", ovm3vip);
+ details.put("ovm3pool", ovm3pool);
+ details.put("ovm3cluster", ovm3cluster);
+
+ if (_publicNetworkDevice != null) {
+ details.put("public.network.device", _publicNetworkDevice);
+ }
+ if (_privateNetworkDevice != null) {
+ details.put("private.network.device", _privateNetworkDevice);
+ }
+ if (_guestNetworkDevice != null) {
+ details.put("guest.network.device", _guestNetworkDevice);
+ }
+ if (_storageNetworkDevice != null) {
+ details.put("storage.network.device", _storageNetworkDevice);
+ }
+ s_logger.warn("network devices: " + _guestNetworkDevice + " "
+ + _privateNetworkDevice + " " + _publicNetworkDevice + " "
+ + _storageNetworkDevice);
+
+ Map<String, Object> params = new HashMap<String, Object>();
+ params.putAll(details);
+
+ ovmResource.configure(hostname, params);
+ ovmResource.start();
+
+ try {
+ c = new Connection(hostIp, Integer.parseInt(agentPort), agentUsername, agentPassword);
+ } catch (Exception e) {
+ String msg = String.format("Cannot connect to Ovm3 agent(IP=%1$s, Port=%1$, username=%3$s, password=*******), discovery failed",
+ hostIp, agentPort, agentUsername);
+ s_logger.warn(msg);
+ throw new CloudRuntimeException(msg);
+ }
+ /* After resource start, we are able to execute our agent api */
+ Linux host = new Linux(c);
+ details.put("agentVersion", host.getAgentVersion());
+ details.put(HostInfo.HOST_OS_KERNEL_VERSION,
+ host.getHostKernelRelease());
+ details.put(HostInfo.HOST_OS, host.getHostOs());
+ details.put(HostInfo.HOST_OS_VERSION, host.getHostOsVersion());
+ details.put(HostInfo.HYPERVISOR_VERSION,
+ host.getHypervisorVersion());
+
+ Map<Ovm3ResourceBase, Map<String, String>> resources = new HashMap<Ovm3ResourceBase, Map<String, String>>();
+ resources.put(ovmResource, details);
+ return resources;
+ } catch (XmlRpcException e) {
+ s_logger.debug("XmlRpc exception, Unable to discover Ovm3 host: " + url.getHost(),
+ e);
+ return null;
+ } catch (UnknownHostException e) {
+ s_logger.debug(
+ "Host name resolve failed exception, Unable to discover Ovm3 host: "
+ + url.getHost(), e);
+ return null;
+ } catch (ConfigurationException e) {
+ s_logger.debug(
+ "Configure resource failed, Unable to discover Ovm3 host: " + url.getHost(),
+ e);
+ return null;
+ } catch (Exception e) {
+ s_logger.debug("Unable to discover Ovm3 host: " + url.getHost(), e);
+ return null;
+ }
+ }
+
+ @Override
+ public void postDiscovery(List<HostVO> hosts, long msId)
+ throws CloudRuntimeException {
+ // TODO Auto-generated method stub
+ s_logger.debug("postDiscovery" + hosts);
+ }
+
+ @Override
+ public boolean matchHypervisor(String hypervisor) {
+ return HypervisorType.Ovm3.toString().equalsIgnoreCase(hypervisor);
+ }
+
+ @Override
+ public HypervisorType getHypervisorType() {
+ return HypervisorType.Ovm3;
+ }
+
+ @Override
+ public HostVO createHostVOForConnectedAgent(HostVO host,
+ StartupCommand[] cmd) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean processAnswers(long agentId, long seq, Answer[] answers) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean processCommands(long agentId, long seq, Command[] commands) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public AgentControlAnswer processControlCommand(long agentId,
+ AgentControlCommand cmd) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* for reconnecting */
+ @Override
+ public void processConnect(Host host, StartupCommand cmd,
+ boolean forRebalance) {
+ }
+
+ @Override
+ public boolean processDisconnect(long agentId, Status state) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean isRecurring() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public int getTimeout() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public boolean processTimeout(long agentId, long seq) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public HostVO createHostVOForDirectConnectAgent(HostVO host,
+ StartupCommand[] startup, ServerResource resource,
+ Map<String, String> details, List<String> hostTags) {
+ StartupCommand firstCmd = startup[0];
+ if (!(firstCmd instanceof StartupRoutingCommand)) {
+ return null;
+ }
+
+ StartupRoutingCommand ssCmd = ((StartupRoutingCommand) firstCmd);
+ if (ssCmd.getHypervisorType() != HypervisorType.Ovm3) {
+ return null;
+ }
+
+ // TODO: Double check this
+ return _resourceMgr.fillRoutingHostVO(host, ssCmd, HypervisorType.Ovm3,
+ details, hostTags);
+ }
+
+ // TODO: Make sure that we cleanup when the host is removed
+ @Override
+ public DeleteHostAnswer deleteHost(HostVO host, boolean isForced,
+ boolean isForceDeleteStorage) throws UnableDeleteHostException {
+ if (host.getType() != com.cloud.host.Host.Type.Routing
+ || host.getHypervisorType() != HypervisorType.Ovm3) {
+ return null;
+ }
+
+ _resourceMgr.deleteRoutingHost(host, isForced, isForceDeleteStorage);
+ return new DeleteHostAnswer(true);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Fencer.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Fencer.java b/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Fencer.java
new file mode 100755
index 0000000..30db663
--- /dev/null
+++ b/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Fencer.java
@@ -0,0 +1,133 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.hypervisor.ovm3.hypervisor;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.FenceAnswer;
+import com.cloud.agent.api.FenceCommand;
+import com.cloud.exception.AgentUnavailableException;
+import com.cloud.exception.OperationTimedoutException;
+import com.cloud.ha.FenceBuilder;
+import com.cloud.host.Host;
+import com.cloud.host.HostVO;
+import com.cloud.host.Status;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.resource.ResourceManager;
+import com.cloud.utils.component.AdapterBase;
+import com.cloud.vm.VirtualMachine;
+
+@Local(value = FenceBuilder.class)
+public class Ovm3Fencer extends AdapterBase implements FenceBuilder {
+ Map<String, Object> _params;
+ private static final Logger s_logger = Logger.getLogger(Ovm3Fencer.class);
+ @Inject
+ AgentManager _agentMgr;
+ @Inject
+ ResourceManager _resourceMgr;
+
+
+ @Override
+ public boolean configure(String name, Map<String, Object> params)
+ throws ConfigurationException {
+ _params = params;
+ return true;
+ }
+
+ @Override
+ public boolean start() {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
+ @Override
+ public boolean stop() {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
+ public Ovm3Fencer() {
+ super();
+ }
+
+ @Override
+ public Boolean fenceOff(VirtualMachine vm, Host host) {
+ if (host.getHypervisorType() != HypervisorType.Ovm3) {
+ s_logger.debug("Don't know how to fence non Ovm3 hosts "
+ + host.getHypervisorType());
+ return null;
+ } else {
+ s_logger.debug("Fencing " + vm + " on host " + host
+ + " with params: "+ _params );
+ }
+
+ List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(host
+ .getClusterId());
+ FenceCommand fence = new FenceCommand(vm, host);
+
+ for (HostVO h : hosts) {
+ if (h.getHypervisorType() != HypervisorType.Ovm3) {
+ continue;
+ }
+
+ if (h.getStatus() != Status.Up) {
+ continue;
+ }
+
+ if (h.getId() == host.getId()) {
+ continue;
+ }
+
+ FenceAnswer answer;
+ try {
+ answer = (FenceAnswer) _agentMgr.send(h.getId(), fence);
+ } catch (AgentUnavailableException e) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Moving on to the next host because "
+ + h.toString() + " is unavailable");
+ }
+ continue;
+ } catch (OperationTimedoutException e) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Moving on to the next host because "
+ + h.toString() + " is unavailable");
+ }
+ continue;
+ }
+
+ if (answer != null && answer.getResult()) {
+ return true;
+ }
+ }
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Unable to fence off " + vm.toString() + " on "
+ + host.toString());
+ }
+
+ return false;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Guru.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Guru.java b/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Guru.java
new file mode 100755
index 0000000..08aac30
--- /dev/null
+++ b/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Guru.java
@@ -0,0 +1,65 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+/* shameless rip from original ovm guru */
+package com.cloud.hypervisor.ovm3.hypervisor;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.hypervisor.HypervisorGuru;
+import com.cloud.hypervisor.HypervisorGuruBase;
+import com.cloud.storage.GuestOSVO;
+import com.cloud.storage.dao.GuestOSDao;
+import com.cloud.vm.VirtualMachineProfile;
+
+@Local(value = HypervisorGuru.class)
+public class Ovm3Guru extends HypervisorGuruBase implements HypervisorGuru {
+ // private static final Logger s_logger = Logger.getLogger(VMwareGuru.class);
+
+ @Inject
+ GuestOSDao _guestOsDao;
+
+ protected Ovm3Guru() {
+ super();
+ }
+
+ @Override
+ public HypervisorType getHypervisorType() {
+ return HypervisorType.Ovm3;
+ }
+
+ @Override
+ public VirtualMachineTO implement(VirtualMachineProfile vm) {
+ VirtualMachineTO to = toVirtualMachineTO(vm);
+ to.setBootloader(vm.getBootLoaderType());
+
+ // Determine the VM's OS description
+ GuestOSVO guestOS = _guestOsDao.findById(vm.getVirtualMachine()
+ .getGuestOSId());
+ to.setOs(guestOS.getDisplayName());
+
+ return to;
+ }
+
+ @Override
+ public boolean trackVmHostChange() {
+ return true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1516b041/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Helper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Helper.java b/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Helper.java
new file mode 100755
index 0000000..8b0b1b5
--- /dev/null
+++ b/plugins/hypervisors/ovm3/src/com/cloud/hypervisor/ovm3/hypervisor/Ovm3Helper.java
@@ -0,0 +1,82 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.hypervisor.ovm3.hypervisor;
+
+import java.util.HashMap;
+
+public class Ovm3Helper {
+ /* /usr/lib64/python2.4/site-packages/agent/lib/assembly */
+ private static final HashMap<String, String> s_ovmMap = new HashMap<String, String>();
+
+ public static final String HVM = "hvm";
+ public static final String PV = "xen_pvm";
+ public static final String DOMSOL = "ldoms_pvm";
+ public static final String DEFAULT = "default";
+
+ static {
+ s_ovmMap.put("Oracle Enterprise Linux 6.0 (32-bit)", PV);
+ s_ovmMap.put("Oracle Enterprise Linux 6.0 (64-bit)", PV);
+ s_ovmMap.put("Oracle Enterprise Linux 5.0 (32-bit)", PV);
+ s_ovmMap.put("Oracle Enterprise Linux 5.0 (64-bit)", PV);
+ s_ovmMap.put("Oracle Enterprise Linux 5.1 (32-bit)", PV);
+ s_ovmMap.put("Oracle Enterprise Linux 5.1 (64-bit)", PV);
+ s_ovmMap.put("Oracle Enterprise Linux 5.2 (32-bit)", PV);
+ s_ovmMap.put("Oracle Enterprise Linux 5.2 (64-bit)", PV);
+ s_ovmMap.put("Oracle Enterprise Linux 5.3 (32-bit)", PV);
+ s_ovmMap.put("Oracle Enterprise Linux 5.3 (64-bit)", PV);
+ s_ovmMap.put("Oracle Enterprise Linux 5.4 (32-bit)", PV);
+ s_ovmMap.put("Oracle Enterprise Linux 5.4 (64-bit)", PV);
+ s_ovmMap.put("Oracle Enterprise Linux 5.5 (32-bit)", PV);
+ s_ovmMap.put("Oracle Enterprise Linux 5.5 (64-bit)", PV);
+ s_ovmMap.put("Other Linux (32-bit)", PV);
+ s_ovmMap.put("Other Linux (64-bit)", PV);
+ s_ovmMap.put("Other PV (32-bit)", PV);
+ s_ovmMap.put("Other PV (64-bit)", PV);
+ s_ovmMap.put("Debian GNU/Linux 7(32-bit)", PV);
+ s_ovmMap.put("Debian GNU/Linux 7(64-bit)", PV);
+ s_ovmMap.put("Linux HVM (32-bit)", HVM);
+ s_ovmMap.put("Linux HVM (64-bit)", HVM);
+ s_ovmMap.put("Dos", HVM);
+ s_ovmMap.put("Windows 7 (32-bit)", HVM);
+ s_ovmMap.put("Windows 7 (64-bit)", HVM);
+ s_ovmMap.put("Windows 8 (64-bit)", HVM);
+ s_ovmMap.put("Windows Server 2003 (32-bit)", HVM);
+ s_ovmMap.put("Windows Server 2003 (64-bit)", HVM);
+ s_ovmMap.put("Windows Server 2008 (32-bit)", HVM);
+ s_ovmMap.put("Windows Server 2008 (64-bit)", HVM);
+ s_ovmMap.put("Windows Server 2008 R2 (64-bit)", HVM);
+ s_ovmMap.put("Windows Server 2012 (64-bit)", HVM);
+ s_ovmMap.put("Windows 2000 SP4 (32-bit)", HVM);
+ s_ovmMap.put("Windows Vista (32-bit)", HVM);
+ s_ovmMap.put("Windows XP SP2 (32-bit)", HVM);
+ s_ovmMap.put("Windows XP SP3 (32-bit)", HVM);
+ s_ovmMap.put("Sun Solaris 10(32-bit)", HVM);
+ s_ovmMap.put("Sun Solaris 10(64-bit)", HVM);
+ s_ovmMap.put("Sun Solaris 9(Experimental)", HVM);
+ s_ovmMap.put("Sun Solaris 8(Experimental)", HVM);
+ s_ovmMap.put("Sun Solaris 11 (32-bit)", HVM);
+ s_ovmMap.put("Sun Solaris 11 (64-bit)", HVM);
+ s_ovmMap.put("Sun Solaris PV (32-bit)", PV);
+ s_ovmMap.put("Sun Solaris PV (64-bit)", PV);
+ s_ovmMap.put("Sun Solaris Sparc (32-bit)", DOMSOL);
+ s_ovmMap.put("Sun Solaris Sparc (64-bit)", DOMSOL);
+ }
+
+ public static String getOvm3GuestType(String stdType) {
+ return s_ovmMap.get(stdType);
+ }
+}