diff --git a/README.md b/README.md index dc62f58..bf38ae4 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,19 @@ Attributes * `openstack["block-storage"]["policy"]["default"]` - default volume operations rule * `openstack["block-storage"]["policy"]["admin_or_owner"]` - Define an admin or owner * `openstack["block-storage"]["policy"]["admin_api"]` - Define api admin +* `openstack["block-storage"]["netapp"]["protocol"]` - how are we talking to either dfm or filer, http or https +* `openstack["block-storage"]["netapp"]["dfm_hostname"]` - Host or IP of your dfm server +* `openstack["block-storage"]["netapp"]["dfm_login"]` - Username for dfm +* `openstack["block-storage"]["netapp"]["dfm_password"]` - password for the dfm user +* `openstack["block-storage"]["netapp"]["dfm_port"]` - default port for dfm +* `openstack["block-storage"]["netapp"]["dfm_web_port"]` - web gui port for wsdl file download +* `openstack["block-storage"]["netapp"]["storage_service"]` - name of the service in dfpm +* `openstack["block-storage"]["netapp"]["netapp_server_port"]` - web admin port of the filer itself +* `openstack["block-storage"]["netapp"]["netapp_server_hostname"]` - hostname of your filer, needs to be resolvable +* `openstack["block-storage"]["netapp"]["netapp_server_login"]` - Username for netapp filer +* `openstack["block-storage"]["netapp"]["netapp_server_password"]` - password for user above +* `openstack["block-storage"]["nfs"]["shares_config"]` - file containing line by line entries of server:export +* `openstack["block-storage"]["nfs"]["mount_point_base"]` - directory to mount NFS exported shares Testing ===== diff --git a/attributes/default.rb b/attributes/default.rb index 1b67000..263784d 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -94,6 +94,15 @@ default["openstack"]["block-storage"]["netapp"]["dfm_port"] = "8088" default["openstack"]["block-storage"]["netapp"]["dfm_web_port"] = "8080" default["openstack"]["block-storage"]["netapp"]["storage_service"] = "storage_service" +# Netapp direct NFS +default["openstack"]["block-storage"]["netapp"]["netapp_server_port"] = "80" +default["openstack"]["block-storage"]["netapp"]["netapp_server_hostname"] = nil +default["openstack"]["block-storage"]["netapp"]["netapp_server_password"] = nil +default["openstack"]["block-storage"]["netapp"]["netapp_server_login"] = nil +default["openstack"]["block-storage"]["netapp"]["export"] = nil +default["openstack"]["block-storage"]["nfs"]["shares_config"] = "/etc/cinder/shares.conf" +default["openstack"]["block-storage"]["nfs"]["mount_point_base"] = "/mnt/cinder-volumes" + # logging attribute default["openstack"]["block-storage"]["syslog"]["use"] = false default["openstack"]["block-storage"]["syslog"]["facility"] = "LOG_LOCAL2" @@ -129,6 +138,7 @@ when "fedora", "redhat", "centos" # :pragma-foodcritic: ~FC024 - won't fix this "cinder_scheduler_service" => "openstack-cinder-scheduler", "cinder_iscsitarget_packages" => ["scsi-target-utils"], "cinder_iscsitarget_service" => "tgtd", + "cinder_nfs_packages" => ["nfs-utils", "nfs-utils-lib"], "package_overrides" => "" } when "ubuntu" @@ -141,6 +151,7 @@ when "ubuntu" "cinder_scheduler_service" => "cinder-scheduler", "cinder_iscsitarget_packages" => ["tgt"], "cinder_iscsitarget_service" => "tgt", + "cinder_nfs_packages" => ["nfs-common"], "package_overrides" => "-o Dpkg::Options::='--force-confold' -o Dpkg::Options::='--force-confdef'" } end diff --git a/recipes/volume.rb b/recipes/volume.rb index 8afce54..871b6c5 100644 --- a/recipes/volume.rb +++ b/recipes/volume.rb @@ -43,11 +43,41 @@ platform_options["cinder_iscsitarget_packages"].each do |pkg| end end -volume_driver = node["openstack"]["block-storage"]["volume"]["driver"] -if volume_driver == "cinder.volume.drivers.netapp.NetAppISCSIDriver" - node.override["openstack"]["block-storage"]["netapp"]["dfm_password"] = service_password "netapp" -elsif volume_driver == 'cinder.volume.drivers.RBDDriver' - node.override["openstack"]["block-storage"]["rbd_secret_uuid"] = service_password "rbd" +case node["openstack"]["block-storage"]["volume"]["driver"] + when "cinder.volume.drivers.netapp.iscsi.NetAppISCSIDriver" + node.override["openstack"]["block-storage"]["netapp"]["dfm_password"] = service_password "netapp" + + when "cinder.volume.drivers.RBDDriver" + node.override["openstack"]["block-storage"]["rbd_secret_uuid"] = service_password "rbd" + + when "cinder.volume.drivers.netapp.nfs.NetAppDirect7modeNfsDriver" + node.override["openstack"]["block-storage"]["netapp"]["netapp_server_password"] = service_password "netapp-filer" + + directory node["openstack"]["block-storage"]["nfs"]["mount_point_base"] do + owner node["openstack"]["block-storage"]["user"] + group node["openstack"]["block-storage"]["group"] + action :create + end + + template node["openstack"]["block-storage"]["nfs"]["shares_config"] do + source "shares.conf.erb" + mode "0600" + owner node["openstack"]["block-storage"]["user"] + group node["openstack"]["block-storage"]["group"] + variables( + "host" => node["openstack"]["block-storage"]["netapp"]["netapp_server_hostname"], + "export" => node["openstack"]["block-storage"]["netapp"]["export"] + ) + notifies :restart, "service[cinder-volume]" + end + + platform_options["cinder_nfs_packages"].each do |pkg| + package pkg do + options platform_options["package_overrides"] + + action :upgrade + end + end end service "cinder-volume" do diff --git a/spec/volume-redhat_spec.rb b/spec/volume-redhat_spec.rb index 81d57c5..9b5c9b9 100644 --- a/spec/volume-redhat_spec.rb +++ b/spec/volume-redhat_spec.rb @@ -30,6 +30,16 @@ describe "openstack-block-storage::volume" do expect(@chef_run).to set_service_to_start_on_boot "tgtd" end + it "installs nfs packages" do + chef_run = ::ChefSpec::ChefRunner.new ::REDHAT_OPTS do |n| + n.set["openstack"]["block-storage"]["volume"]["driver"] = "cinder.volume.drivers.netapp.nfs.NetAppDirect7modeNfsDriver" + end + chef_run.converge "openstack-block-storage::volume" + + expect(chef_run).to upgrade_package "nfs-utils" + expect(chef_run).to upgrade_package "nfs-utils-lib" + end + it "has redhat include" do file = "/etc/tgt/targets.conf" diff --git a/spec/volume_spec.rb b/spec/volume_spec.rb index a716901..ccd53f8 100644 --- a/spec/volume_spec.rb +++ b/spec/volume_spec.rb @@ -28,11 +28,29 @@ describe "openstack-block-storage::volume" do expect(@chef_run).to upgrade_package "tgt" end + it "installs nfs packages" do + chef_run = ::ChefSpec::ChefRunner.new ::UBUNTU_OPTS do |n| + n.set["openstack"]["block-storage"]["volume"]["driver"] = "cinder.volume.drivers.netapp.nfs.NetAppDirect7modeNfsDriver" + end + chef_run.converge "openstack-block-storage::volume" + + expect(chef_run).to upgrade_package "nfs-common" + end + + it "creates the nfs mount point" do + chef_run = ::ChefSpec::ChefRunner.new ::UBUNTU_OPTS do |n| + n.set["openstack"]["block-storage"]["volume"]["driver"] = "cinder.volume.drivers.netapp.nfs.NetAppDirect7modeNfsDriver" + end + chef_run.converge "openstack-block-storage::volume" + + expect(chef_run).to create_directory "/mnt/cinder-volumes" + end + it "configures netapp dfm password" do ::Chef::Recipe.any_instance.stub(:service_password).with("netapp"). and_return "netapp-pass" chef_run = ::ChefSpec::ChefRunner.new ::UBUNTU_OPTS do |n| - n.set["openstack"]["block-storage"]["volume"]["driver"] = "cinder.volume.drivers.netapp.NetAppISCSIDriver" + n.set["openstack"]["block-storage"]["volume"]["driver"] = "cinder.volume.drivers.netapp.iscsi.NetAppISCSIDriver" end chef_run.converge "openstack-block-storage::volume" n = chef_run.node["openstack"]["block-storage"]["netapp"]["dfm_password"] diff --git a/templates/default/cinder.conf.erb b/templates/default/cinder.conf.erb index 4d48e5d..165fa61 100644 --- a/templates/default/cinder.conf.erb +++ b/templates/default/cinder.conf.erb @@ -605,36 +605,18 @@ netapp_storage_service=<%= node["openstack"]["block-storage"]["netapp"]["storage <% end %> ######## defined in cinder.volume.netapp_nfs ######## +<% if node["openstack"]["block-storage"]["volume"]["driver"] == "cinder.volume.drivers.netapp.nfs.NetAppDirect7modeNfsDriver" %> -# synchronous_snapshot_create=0 -#### (IntOpt) Does snapshot creation call returns immediately - -# netapp_wsdl_url= -#### (StrOpt) URL of the WSDL file for the DFM server - -# netapp_login= -#### (StrOpt) User name for the DFM server - -# netapp_password= -#### (StrOpt) Password for the DFM server - -# netapp_server_hostname= -#### (StrOpt) Hostname for the DFM server - -# netapp_server_port=8088 -#### (IntOpt) Port number for the DFM server - -# netapp_storage_service= -#### (StrOpt) Storage service to use for provisioning (when -#### volume_type=None) - -# netapp_storage_service_prefix= -#### (StrOpt) Prefix of storage service name to use for provisioning -#### (volume_type name will be appended) - -# netapp_vfiler= -#### (StrOpt) Vfiler to use for provisioning +nfs_mount_point_base=<%= node["openstack"]["block-storage"]["nfs"]["mount_point_base"] %> +<% node["openstack"]["block-storage"]["netapp"]["netapp_server_hostname"].each do |h| %> +netapp_server_hostname=<%= h %> +<% end %> +netapp_server_port=<%= node["openstack"]["block-storage"]["netapp"]["netapp_server_port"] %> +netapp_login=<%= node["openstack"]["block-storage"]["netapp"]["netapp_server_login"] %> +netapp_password=<%= node["openstack"]["block-storage"]["netapp"]["netapp_server_password"] %> +nfs_share_config=<%= node["openstack"]["block-storage"]["nfs"]["shares_config"] %> +<% end %> ######## defined in cinder.volume.nexenta.volume ######## diff --git a/templates/default/shares.conf.erb b/templates/default/shares.conf.erb new file mode 100644 index 0000000..02542b0 --- /dev/null +++ b/templates/default/shares.conf.erb @@ -0,0 +1,4 @@ +# Automatically generated by chef, changes will be overwritten +<% node["openstack"]["block-storage"]["netapp"]["netapp_server_hostname"].each do |h| %> +<%= h %>:<%= @nfs_export %> +<% end %>