components/puppet/files/solaris/lib/puppet/provider/link_aggregation/solaris.rb
branchs11-update
changeset 2771 8e4227dc2fc4
child 1921 489d0d0f656f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/puppet/files/solaris/lib/puppet/provider/link_aggregation/solaris.rb	Mon Sep 23 10:03:20 2013 -0700
@@ -0,0 +1,186 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+#
+
+Puppet::Type.type(:link_aggregation).provide(:link_aggregation) do
+    desc "Provider for creating Oracle Solaris link aggregations"
+    confine :operatingsystem => [:solaris]
+    defaultfor :osfamily => :solaris, :kernelrelease => ['5.11', '5.12']
+    commands :dladm => '/usr/sbin/dladm'
+
+    def self.instances
+        dladm("show-aggr", "-p", "-o",
+              "link,mode,policy,addrpolicy,lacpactivity,lacptimer").split(
+              "\n").collect do |line|
+            link, mode, policy, addrpolicy, lacpactivity, lacptimer = \
+                line.split(":")
+
+            links = []
+            dladm("show-aggr", "-x", "-p", "-o", "port").split(
+                  "\n").each do |portline|
+                next if portline.strip() == ""
+                links << portline.strip()
+            end
+
+            new(:name => link,
+                :ensure => :present,
+                :lower_links => links.join(" "),
+                :mode => mode,
+                :policy => policy,
+                :address => addrpolicy,
+                :lacpmode => lacpactivity,
+                :lacptimer => lacptimer)
+        end
+    end
+
+    def self.prefetch(resources)
+        # pull the instances on the system
+        aggrs = instances
+
+        # set the provider for the resource to set the property_hash
+        resources.keys.each do |name|
+            if provider = aggrs.find{ |aggr| aggr.name == name}
+                resources[name].provider = provider
+            end
+        end
+    end
+
+    # property getters
+    [:lower_links, :mode, :policy, :lacpmode, :lacptimer,
+     :address].each do |field|
+        define_method(field) do
+            @property_hash[field]
+        end
+    end
+
+    # property setters
+    def lower_links=(value)
+        is_temporary?(@resource[:name])
+        current = self.lower_links.split()
+        remove_list = []
+        for entry in current - value
+            remove_list << "-l" << entry
+        end
+
+        add_list = []
+        for entry in value - current
+            add_list << "-l" << entry
+        end
+
+        if not add_list.empty?
+            dladm("add-aggr", add_list, @resource[:name])
+        end
+
+        if not remove_list.empty?
+            dladm("remove-aggr", remove_list, @resource[:name])
+        end
+    end
+
+    def mode=(value)
+        is_temporary?(@resource[:name])
+        dladm("modify-aggr", "-m", value, @resource[:name])
+    end
+
+    def policy=(value)
+        is_temporary?(@resource[:name])
+        dladm("modify-aggr", "-P", value, @resource[:name])
+    end
+
+    def lacpmode=(value)
+        is_temporary?(@resource[:name])
+        dladm("modify-aggr", "-L", value, @resource[:name])
+    end
+
+    def lacptimer=(value)
+        is_temporary?(@resource[:name])
+        dladm("modify-aggr", "-T", value, @resource[:name])
+    end
+
+    def address=(value)
+        is_temporary?(@resource[:name])
+        dladm("modify-aggr", "-u", value, @resource[:name])
+    end
+
+    def add_options
+        options = []
+        if @resource[:temporary] == :true
+            options << "-t"
+        end
+
+        if lowerlinks = @resource[:lower_links]
+            if lowerlinks.is_a? Array
+                for link in lowerlinks
+                    options << "-l" << link
+                end
+            else
+                options << "-l" << lowerlinks
+            end
+        end
+
+        if mode = @resource[:mode]
+            options << "-m" << mode
+        end
+
+        if policy = @resource[:policy]
+            options << "-P" << policy
+        end
+
+        if lacpmode = @resource[:lacpmode]
+            options << "-L" << lacpmode
+        end
+
+        if lacptimer = @resource[:lacptimer]
+            options << "-T" << lacptimer
+        end
+
+        if address = @resource[:address]
+            options << "-u" << address
+        end
+        options
+    end
+
+    def exists?
+        @property_hash[:ensure] == :present
+    end
+
+    def create
+        dladm("create-aggr", add_options, @resource[:name])
+    end
+
+    def destroy
+        dladm("delete-aggr", add_options, @resource[:name])
+    end
+
+    def is_temporary?(name)
+        p = exec_cmd(command(:dladm), "show-aggr", "-P", name)
+        raise Puppet::Error, "Unable to change attributes of temporary " \
+            "aggregation #{@resource[:name]}" if p[:exit] == 1
+    end
+
+    def exec_cmd(*cmd)
+        output = Puppet::Util::Execution.execute(cmd, :failonfail => false)
+        {:out => output, :exit => $CHILD_STATUS.exitstatus}
+    end
+end
+