mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-11-04 00:02:37 +01:00 
			
		
		
		
	* DB : Add support for MySQL 8
- Splits commands to create user and grant access on database, the old
statement is no longer supported by MySQL 8.x
- `NO_AUTO_CREATE_USER` is no longer supported by MySQL 8.x so remove
that from db.properties conn parameters
For mysql-server 8.x setup the following changes were added/tested to
make it work with CloudStack in /etc/mysql/mysql.conf.d/mysqld.cnf and
then restart the mysql-server process:
    server_id = 1
    sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_ENGINE_SUBSTITUTION"
    innodb_rollback_on_timeout=1
    innodb_lock_wait_timeout=600
    max_connections=1000
    log-bin=mysql-bin
    binlog-format = 'ROW'
    default-authentication-plugin=mysql_native_password
Notice the last line above, this is to reset the old password based
authentication used by MySQL 5.x.
Developers can set empty password as follows:
    > sudo mysql -u root
    ALTER USER 'root'@'localhost' IDENTIFIED BY '';
In libvirt repository, there are two related commits
2019-08-23 13:13 Daniel P. Berrangé            ● rpm: don't enable socket activation in upgrade if --listen present
2019-08-22 14:52 Daniel P. Berrangé            ● remote: forbid the --listen arg when systemd socket activation
In libvirt.spec.in
        /bin/systemctl mask libvirtd.socket >/dev/null 2>&1 || :
        /bin/systemctl mask libvirtd-ro.socket >/dev/null 2>&1 || :
        /bin/systemctl mask libvirtd-admin.socket >/dev/null 2>&1 || :
        /bin/systemctl mask libvirtd-tls.socket >/dev/null 2>&1 || :
        /bin/systemctl mask libvirtd-tcp.socket >/dev/null 2>&1 || :
Co-authored-by: Wei Zhou <w.zhou@global.leaseweb.com>
Co-authored-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
Co-authored-by: Rohit Yadav <rohit.yadav@shapeblue.com>
		
	
			
		
			
				
	
	
		
			130 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env python3
 | 
						|
# 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.
 | 
						|
 | 
						|
#
 | 
						|
# Talk to a KVM guest through Libvirt and the Qemu Guest Agent
 | 
						|
# to retrieve information from the guest
 | 
						|
#
 | 
						|
# System VMs have the Qemu Guest Agent installed by default
 | 
						|
# and should properly respond to such commands
 | 
						|
 | 
						|
#
 | 
						|
# Talk to KVM Instances through the Qemu Guest Agent
 | 
						|
#
 | 
						|
 | 
						|
import argparse
 | 
						|
import json
 | 
						|
import sys
 | 
						|
import libvirt
 | 
						|
import libvirt_qemu
 | 
						|
 | 
						|
COMMANDS = ["info", "ping", "fstrim"]
 | 
						|
 | 
						|
 | 
						|
class Libvirt:
 | 
						|
    def __init__(self, uri=None, timeout=5):
 | 
						|
        self.timeout = timeout
 | 
						|
        self.conn = libvirt.open(uri)
 | 
						|
        if not self.conn:
 | 
						|
            raise Exception('Failed to open connection to the hypervisor')
 | 
						|
 | 
						|
    def get_domain(self, name):
 | 
						|
        return self.conn.lookupByName(name)
 | 
						|
 | 
						|
    def agent_command(self, dom, cmd, flags=0, raw=False):
 | 
						|
        ret = libvirt_qemu.qemuAgentCommand(dom, json.dumps({'execute': cmd}),
 | 
						|
                                            self.timeout, flags)
 | 
						|
        if raw:
 | 
						|
            return ret
 | 
						|
 | 
						|
        return json.loads(ret)['return']
 | 
						|
 | 
						|
class GuestCommand:
 | 
						|
    def __init__(self, domain, timeout):
 | 
						|
        self.domain = domain
 | 
						|
        self.timeout = timeout
 | 
						|
        self.virt = Libvirt(timeout=self.timeout)
 | 
						|
        self.dom = self.virt.get_domain(self.domain)
 | 
						|
 | 
						|
    def ping(self):
 | 
						|
        result = self.virt.agent_command(self.dom, 'guest-ping')
 | 
						|
 | 
						|
        res = False
 | 
						|
        code = 1
 | 
						|
        if len(result) == 0:
 | 
						|
            res = True
 | 
						|
            code = 0
 | 
						|
 | 
						|
        return {'result': res}, code
 | 
						|
 | 
						|
    def info(self):
 | 
						|
        info = dict()
 | 
						|
        info['filesystem'] = 'guest-get-fsinfo'
 | 
						|
        info['network'] = 'guest-network-get-interfaces'
 | 
						|
 | 
						|
        result = dict()
 | 
						|
        for key, cmd in list(info.items()):
 | 
						|
            result[key] = self.virt.agent_command(self.dom, cmd)
 | 
						|
 | 
						|
        return result, 0
 | 
						|
 | 
						|
    def fstrim(self):
 | 
						|
        result = self.virt.agent_command(self.dom, 'guest-fstrim')
 | 
						|
 | 
						|
        res = False
 | 
						|
        code = 1
 | 
						|
        if len(result) > 0:
 | 
						|
            res = True
 | 
						|
            code = 0
 | 
						|
 | 
						|
        return {'result': result}, code
 | 
						|
 | 
						|
 | 
						|
def main(args):
 | 
						|
    command = args.command
 | 
						|
 | 
						|
    try:
 | 
						|
        guestcmd = GuestCommand(args.instance, args.timeout)
 | 
						|
        result = {'error': 'Command not implemented'}
 | 
						|
        code = 255
 | 
						|
 | 
						|
        if command == 'info':
 | 
						|
            result, code = guestcmd.info()
 | 
						|
        elif command == 'ping':
 | 
						|
            result, code = guestcmd.ping()
 | 
						|
        elif command == 'fstrim':
 | 
						|
            result, code = guestcmd.fstrim()
 | 
						|
 | 
						|
        print(json.dumps(result))
 | 
						|
        sys.exit(code)
 | 
						|
    except libvirt.libvirtError as exc:
 | 
						|
        print(json.dumps({'error': str(exc)}))
 | 
						|
        sys.exit(255)
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    parser = argparse.ArgumentParser(description='CloudStack Guest Tool')
 | 
						|
    parser.add_argument('instance', type=str,
 | 
						|
                        help='Instance Name')
 | 
						|
    parser.add_argument('--command', type=str, required=False,
 | 
						|
                        help='Command to execute', default='info',
 | 
						|
                        choices=COMMANDS)
 | 
						|
    parser.add_argument('--timeout', type=int, required=False,
 | 
						|
                        help='timeout in seconds', default=5)
 | 
						|
    args = parser.parse_args()
 | 
						|
    main(args)
 |