mirror of https://github.com/apache/cloudstack.git
210 lines
6.6 KiB
Python
Executable File
210 lines
6.6 KiB
Python
Executable File
#!/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
|