From 323f05de0a3ace6fd39bb75e97ce2ac52db2fa63 Mon Sep 17 00:00:00 2001 From: John Eckersberg Date: Mon, 4 Feb 2008 16:10:58 -0500 Subject: Add overlord netapp module so we can create filer objects. Hot. --- func.spec | 1 + func/overlord/modules/netapp.py | 82 +++++++++++++++++++++++++++++++++++++++++ setup.py | 1 + 3 files changed, 84 insertions(+) create mode 100644 func/overlord/modules/netapp.py diff --git a/func.spec b/func.spec index 4547129..1ce6fe0 100644 --- a/func.spec +++ b/func.spec @@ -71,6 +71,7 @@ rm -fr $RPM_BUILD_ROOT %{python_sitelib}/func/minion/*.py* %{python_sitelib}/func/overlord/*.py* %{python_sitelib}/func/overlord/cmd_modules/*.py* +%{python_sitelib}/func/overlord/modules/*.py* %{python_sitelib}/func/*.py* %dir %{python_sitelib}/func/minion/modules %{python_sitelib}/func/minion/modules/*.py* diff --git a/func/overlord/modules/netapp.py b/func/overlord/modules/netapp.py new file mode 100644 index 0000000..987901e --- /dev/null +++ b/func/overlord/modules/netapp.py @@ -0,0 +1,82 @@ +## +## Overlord library to interface with minion-side netapp operations +## +## Most of this is just wrappers to create some cleaner, earier to use +## interfaces. Also allows users to get function signatures and use +## nice things like kwargs client side, for those of us who can't live +## without ipython introspection. +## +## Copyright 2008, Red Hat, Inc +## John Eckersberg +## +## This software may be freely redistributed under the terms of the GNU +## general public license. +## +## 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., 675 Mass Ave, Cambridge, MA 02139, USA. +## + +from func.overlord.client import Client + +class RemoteError(Exception): pass + +def _(res): + if type(res) == type([]) and res[0] == 'REMOTE_ERROR': + raise RemoteError, res[2] + else: + return res + +class Filer(Client): + def __init__(self, filer, admin_host): + Client.__init__(self, admin_host) + self.filer = filer + self.admin_host = admin_host + + def create_volume(self, vol, aggr, size): + return _(self.netapp.vol.create(self.filer, vol, aggr, size)[self.admin_host]) + + def destroy_volume(self, vol): + # offline it first + try: + self.netapp.vol.offline(self.filer, vol) + except: + pass + return _(self.netapp.vol.destroy(self.filer, vol)[self.admin_host]) + + def offline_volume(self, vol): + return _(self.netapp.vol.offline(self.filer, vol)[self.admin_host]) + + def online_volume(self, vol): + return _(self.netapp.vol.online(self.filer, vol)[self.admin_host]) + + def get_volume_size(self, vol): + return _(self.netapp.vol.size(self.filer, vol)[self.admin_host]) + + def resize_volume(self, vol, delta): + return _(self.netapp.vol.size(self.filer, vol, delta)[self.admin_host]) + + def create_snapshot(self, vol, snap): + return _(self.netapp.snap.create(self.filer, vol, snap)[self.admin_host]) + + def delete_snapshot(self, vol, snap): + return _(self.netapp.snap.delete(self.filer, vol, snap)[self.admin_host]) + + def create_clone_volume(self, vol, parent, snap): + return _(self.netapp.vol.clone.create(self.filer, vol, parent, snap)[self.admin_host]) + + def split_clone_volume(self, vol): + return _(self.netapp.vol.clone.split(self.filer, vol)[self.admin_host]) + + def list_volumes(self): + vols = _(self.netapp.vol.status(self.filer)) + return_list = [] + for vol in vols: + return_list.append(vol['name']) + return return_list + + def volume_details(self, vol=None): + if vol: + return _(self.netapp.vol.status(self.filer, vol)[self.admin_host]) + else: + return _(self.netapp.vol.status(self.filer)[self.admin_host]) diff --git a/setup.py b/setup.py index 020cc39..332ff96 100644 --- a/setup.py +++ b/setup.py @@ -42,6 +42,7 @@ if __name__ == "__main__": "%s/minion" % NAME, "%s/overlord" % NAME, "%s/overlord/cmd_modules" % NAME, + "%s/overlord/modules" % NAME, "%s/minion/modules" % NAME, # FIXME if there's a clean/easy way to recursively # find modules then by all means do it, for now -- cgit