blob: fdc077dff04f87c9f45fbe97c681b36e3de4d6a7 [file] [log] [blame]
# 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.
from .utilities import Distribution, serviceOpsRedhat,serviceOpsUbuntu,serviceOpsRedhat7Later
from .serviceConfig import *
class sysConfigFactory:
@staticmethod
def getSysConfigFactory(glbEnv):
if glbEnv.mode == "Agent":
return sysConfigAgentFactory.getAgent(glbEnv)
elif glbEnv.mode == "Server":
return sysConfigServerFactory.getServer(glbEnv)
elif glbEnv.mode == "HttpsServer":
return sysConfigServerFactory.getServer(glbEnv)
elif glbEnv.mode == "Db":
return sysConfigDbFactory.getDb(glbEnv)
else:
raise CloudInternalException("Need to specify which mode are u running: Agent/Server/Db")
class sysConfigAgentFactory:
@staticmethod
def getAgent(glbEnv):
glbEnv.distribution = Distribution()
distribution = glbEnv.distribution.getVersion()
if distribution == "Ubuntu":
return sysConfigAgentUbuntu(glbEnv)
elif distribution == "Fedora" or distribution == "RHEL6":
return sysConfigRedhat6(glbEnv)
elif distribution == "CentOS" or distribution == "RHEL5":
return sysConfigRedhat5(glbEnv)
elif distribution == "RHEL7":
return sysConfigRedhat7(glbEnv)
elif distribution == "RHEL8":
return sysConfigRedhat8(glbEnv)
else:
print("Can't find the distribution version")
return sysConfig()
class sysConfigServerFactory:
@staticmethod
def getServer(glbEnv):
glbEnv.distribution = Distribution()
distribution = glbEnv.distribution.getVersion()
if distribution == "Ubuntu":
return sysConfigServerUbuntu(glbEnv)
elif distribution != "Unknown":
return sysConfigServerRedhat(glbEnv)
else:
print("Can't find the distribution version")
return sysConfig()
class sysConfigDbFactory:
@staticmethod
def getDb(glbEnv):
pass
class sysConfig(object):
def __init__(self, env):
self.env = env
self.services = []
def registerService(self, service):
self.services.append(service(self))
def config(self):
if not self.check():
return False
for service in self.services:
if not service.configration():
raise CloudInternalException("Configuration failed for service %s" % service.serviceName)
def restore(self):
for service in self.services:
service.backup()
def check(self):
return True
class sysConfigAgent(sysConfig):
def __init__(self, env):
super(sysConfigAgent, self).__init__(env)
def check(self):
if self.env.debug:
return True
if self.env.agentMode == "myCloud":
if self.env.distribution.getVersion() != "Ubuntu":
raise CloudInternalException("Need to run myCloud agent on an Ubuntu machine\n")
elif self.env.distribution.getArch() != "x86_64":
raise CloudInternalException("Need to run myCloud agent on an 64bit machine\n")
#check free disk space on the local disk
if os.path.exists("/var/lib/libvirt/images"):
size = -1
try:
size = int(bash("df -P /var/lib/libvirt/images | tail -1 |awk '{print $4}'").getStdout())
except:
pass
if size != -1 and size < (30 * 1024 * 1024):
raise CloudRuntimeException("Need at least 30G free disk space under /var/lib/libvirt/images")
#check memory
mem = -1
try:
mem = int(bash("free -g|grep Mem|awk '{print $2}'").getStdout())
except:
pass
if mem != -1 and mem < 1:
raise CloudRuntimeException("Need at least 1G memory")
if os.geteuid() != 0:
raise CloudInternalException("Need to execute with root permission\n")
hostname = bash("hostname -f")
if not hostname.isSuccess():
raise CloudInternalException("Checking hostname ... [Failed]\nPlease edit /etc/hosts, add a Fully Qualified Domain Name as your hostname\n")
kvmEnabled = self.svo.isKVMEnabled()
if not kvmEnabled:
raise CloudInternalException("Checking KVM...[Failed]\nPlease enable KVM on this machine\n")
return True
class sysConfigAgentRedhatBase(sysConfigAgent):
def __init__(self, env):
self.svo = serviceOpsRedhat()
super(sysConfigAgentRedhatBase, self).__init__(env)
class sysConfigAgentRedhat7Base(sysConfigAgent):
def __init__(self, env):
self.svo = serviceOpsRedhat7Later()
super(sysConfigAgentRedhat7Base, self).__init__(env)
class sysConfigAgentRedhat8Base(sysConfigAgent):
def __init__(self, env):
self.svo = serviceOpsRedhat7Later()
super(sysConfigAgentRedhat8Base, self).__init__(env)
class sysConfigAgentUbuntu(sysConfigAgent):
def __init__(self, glbEnv):
super(sysConfigAgentUbuntu, self).__init__(glbEnv)
self.svo = serviceOpsUbuntu()
self.services = [securityPolicyConfigUbuntu(self),
networkConfigUbuntu(self),
libvirtConfigUbuntu(self),
firewallConfigUbuntu(self),
nfsConfig(self),
cloudAgentConfig(self)]
#it covers RHEL6/Fedora13/Fedora14
class sysConfigRedhat6(sysConfigAgentRedhatBase):
def __init__(self, glbEnv):
super(sysConfigRedhat6, self).__init__(glbEnv)
self.services = [cgroupConfig(self),
securityPolicyConfigRedhat(self),
networkConfigRedhat(self),
libvirtConfigRedhat(self),
firewallConfigAgent(self),
nfsConfig(self),
cloudAgentConfig(self)]
#It covers RHEL5/CentOS5, the mainly difference is that there is no cgroup
class sysConfigRedhat5(sysConfigAgentRedhatBase):
def __init__(self, glbEnv):
super(sysConfigRedhat5, self).__init__(glbEnv)
self.services = [
securityPolicyConfigRedhat(self),
networkConfigRedhat(self),
libvirtConfigRedhat(self),
firewallConfigAgent(self),
cloudAgentConfig(self)]
#it covers RHEL7
class sysConfigRedhat7(sysConfigAgentRedhat7Base):
def __init__(self, glbEnv):
super(sysConfigRedhat7, self).__init__(glbEnv)
self.services = [securityPolicyConfigRedhat(self),
networkConfigRedhat(self),
libvirtConfigRedhat(self),
firewallConfigAgent(self),
nfsConfig(self),
cloudAgentConfig(self)]
#it covers RHEL8
class sysConfigRedhat8(sysConfigAgentRedhat8Base):
def __init__(self, glbEnv):
super(sysConfigRedhat8, self).__init__(glbEnv)
self.services = [securityPolicyConfigRedhat(self),
networkConfigRedhat(self),
libvirtConfigRedhat(self),
firewallConfigAgent(self),
nfsConfig(self),
cloudAgentConfig(self)]
class sysConfigServer(sysConfig):
def check(self):
if os.geteuid() != 0:
raise CloudInternalException("Need to execute with root permission")
hostname = bash("hostname -f")
if not hostname.isSuccess():
raise CloudInternalException("Checking hostname ... [Failed]\nPlease edit /etc/hosts, add a Fully Qualified Domain Name as your hostname\n")
return True
class sysConfigServerRedhat(sysConfigServer):
def __init__(self, glbEnv):
super(sysConfigServerRedhat, self).__init__(glbEnv)
self.svo = serviceOpsRedhat()
self.services = []
class sysConfigServerUbuntu(sysConfigServer):
def __init__(self, glbEnv):
super(sysConfigServerUbuntu, self).__init__(glbEnv)
self.svo = serviceOpsUbuntu()
self.services = []