mds_plugin/general.py (129 lines of code) (raw):
# Copyright (c) 2021, 2025, Oracle and/or its affiliates.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is designed to work with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms, as
# designated in a particular file or component or in included license
# documentation. The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have either included with
# the program or referenced in the documentation.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
# the GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
"""Sub-Module for shortcut functions"""
from mysqlsh.plugin_manager import plugin_function
from mds_plugin import core, configuration
# Define plugin version
VERSION = "1.19.10"
@plugin_function('mds.info')
def info():
"""Prints basic information about this plugin.
Returns:
None
"""
print("MySQL Shell MDS Plugin for managing the MySQL Database Service (MDS) "
f"Version {VERSION} PREVIEW\n"
"Warning! For testing purposes only!")
print(f"\n- mds.ls() can be used to list the current compartment's "
f"resources, \n- mds.cd() to change the current compartment and "
f"\n- mds.set.* functions to change the current objects.\n\n"
f"For more help type \\? mds.\n")
@plugin_function('mds.version')
def version():
"""Returns the version number of the plugin
Returns:
str
"""
return VERSION
@plugin_function('mds.ls')
def ls(compartment_path="", compartment_id=None, config=None):
"""Lists the compartment's sub-compartments and other resources
This function will list all sub-compartments of the compartment with the
given current_id. If current_id is omitted, all compartments are listed.
Args:
compartment_path (str): The compartment path.
compartment_id (str): OCID of the parent compartment.
config (dictionary): An OCI config object or None.
Returns:
None
If compartment_path and the compartment_id are omitted, the current
compartment's sub-compartments are listed.
"""
# Get the active config, compartment and instance
try:
config = configuration.get_current_config(config=config)
compartment_id = configuration.get_current_compartment_id(
compartment_id=compartment_id, config=config)
except ValueError as e:
print(f"ERROR: {str(e)}")
return
import oci.identity
import oci.util
import re
from mds_plugin import compartment, mysql_database_service, compute
from mds_plugin import object_store, bastion
if compartment_path != "":
compartment_id = compartment.get_compartment_id_by_path(
compartment_path=compartment_path, compartment_id=compartment_id,
config=config)
comp_list = ""
db_sys_list = ""
compute_list = ""
bucket_list = ""
bastion_list = ""
try:
comp_list = ""
if compartment_id is not None:
# Get the full path of this tenancy
full_path = compartment.get_compartment_full_path(
compartment_id, config)
print(f"Directory of compartment {full_path}\n")
comp_list = compartment.list_compartments(
compartment_id=compartment_id, config=config, interactive=False,
raise_exceptions=True, return_formatted=True)
# List Child Compartments
if comp_list:
print("Child Compartments:")
print(comp_list)
except oci.exceptions.ServiceError as e:
# If a 404 error occurs, the user does not have privileges to list items
if e.status == 404:
print("No privileges to list compartments.")
else:
print(f'ERROR: {e.message}. (Code: {e.code}; Status: {e.status})')
return
except Exception as e:
print(f'ERROR: {e}')
return
try:
# List MySQL DB Systems
db_sys_list = mysql_database_service.list_db_systems(
compartment_id=compartment_id, config=config, interactive=False,
raise_exceptions=True, return_formatted=True)
if db_sys_list:
print("MySQL DB Systems:")
print(db_sys_list)
except oci.exceptions.ServiceError as e:
# If a 404 error occurs, the user does not have privileges to list items
if e.status == 404:
print("No privileges to list MySQL DB Systems in this "
"compartment.")
else:
print(f'Could not list the MySQL DB Systems.')
print(f'ERROR: {e.message}. (Code: {e.code}; Status: {e.status})')
return
except Exception as e:
print(f'ERROR: {e}')
return
# List Compute Instances
try:
compute_list = compute.list_instances(
compartment_id=compartment_id, config=config, interactive=False,
raise_exceptions=True, return_formatted=True)
if compute_list != "":
print("Compute Instances:")
print(compute_list)
except oci.exceptions.ServiceError as e:
if e.status == 404:
print("No privileges to list the compute instances in this "
"compartment.")
else:
print(f'Could not list the compute instances.')
print(f'ERROR: {e.message}. (Code: {e.code}; Status: {e.status})')
# List Bastions and Sessions
try:
bastion_list = bastion.list_bastions(
compartment_id=compartment_id, config=config, interactive=False,
raise_exceptions=True, return_type=core.RETURN_STR)
if bastion_list != "":
print("Bastions:")
print(bastion_list)
except oci.exceptions.ServiceError as e:
if e.status == 404:
print("No privileges to list the bastions in this "
"compartment.")
else:
print(f'Could not list the bastions.')
print(f'ERROR: {e.message}. (Code: {e.code}; Status: {e.status})')
# List Object Store Buckets
try:
bucket_list = object_store.list_buckets(
compartment_id=compartment_id, config=config, interactive=False,
raise_exceptions=True, return_formatted=True)
if bucket_list != "":
print("Object Store Buckets:")
print(bucket_list)
except oci.exceptions.ServiceError as e:
if e.status == 404:
print('No privileges to list the object store buckets in this '
'compartment.')
else:
print(f'Could not list the object store buckets.')
print(f'ERROR: {e.message}. (Code: {e.code}; Status: {e.status})')
if comp_list == "" and db_sys_list == "" and compute_list == "" and \
bastion_list == "" and bucket_list == "":
print("-\n")
# if compartment_id == config.get('tenancy'):
# print("Other Resources:")
# print(" - Users\n"
# " - Groups\n")
@plugin_function('mds.cd')
def cd(compartment_path=None, compartment_id=None,
config=None, profile_name=None,
file_location="~/.oci/oci_cli_rc"):
"""Change the current compartment to the given one
If no compartment is specified, let the user choose one
Args:
compartment_path (str): The path of the compartment
compartment_id (str): The id of the compartment.
config (object): An OCI config object or None.
profile_name (str): The name of the profile currently in use
file_location (str): The location of the OCI CLI config file
Returns:
none
If compartment_id is omitted, the current compartment of the connection will be used.
If profile_name is omitted, the DEFAULT profile is used.
If file_location is omitted, ~/.oci/oci_cli_rc is used.
"""
configuration.set_current_compartment(
compartment_path=compartment_path, compartment_id=compartment_id,
config=config, profile_name=profile_name, file_location=file_location)