diff --git a/BrainPortal/app/controllers/data_providers_controller.rb b/BrainPortal/app/controllers/data_providers_controller.rb index b39726684..fbd8edf22 100644 --- a/BrainPortal/app/controllers/data_providers_controller.rb +++ b/BrainPortal/app/controllers/data_providers_controller.rb @@ -64,6 +64,8 @@ def show #:nodoc: @provider = DataProvider.find(data_provider_id) cb_notice "Provider not accessible by current user." unless @provider.can_be_accessed_by?(current_user) + @typelist = get_type_list + respond_to do |format| format.html # show.html.erb format.xml { @@ -77,19 +79,30 @@ def show #:nodoc: def new #:nodoc: provider_group_id = current_assignable_group.id - @provider = DataProvider.new( :user_id => current_user.id, + @provider = DataProvider.new( + :user_id => current_user.id, :group_id => provider_group_id, :online => true, :read_only => false ) - @typelist = get_type_list + @unsaved_meta = {} + @is_personal = false + @typelist = get_type_list + + # Edit/create/show are the same view + render :action => :show end def create #:nodoc: @provider = DataProvider.sti_new(data_provider_params) @provider.user_id ||= current_user.id # disabled field in form DOES NOT send value! @provider.group_id ||= current_assignable_group.id + @unsaved_meta = params[:meta] || {} + + # Fix some attributes + @provider.update_attributes(userkey_provider_params) if @provider.is_a?(UserkeyFlatDirSshDataProvider) + @provider.update_attributes(s3_provider_params) if @provider.is_a?(S3FlatDataProvider) if @provider.save add_meta_data_from_form(@provider, [:must_move, :no_uploads, :no_viewers, :browse_gid]) @@ -103,7 +116,7 @@ def create #:nodoc: else @typelist = get_type_list respond_to do |format| - format.html { render :action => :new } + format.html { render :action => :show } format.xml { render :xml => @provider.errors, :status => :unprocessable_entity } format.json { render :json => @provider.errors, :status => :unprocessable_entity } end @@ -117,32 +130,40 @@ def new_personal #:nodoc: :online => true, :read_only => false, ) - @groups = current_user.assignable_groups + @unsaved_meta = {} + @is_personal = true + @typelist = get_personal_type_list + + # Edit/create/show are the same view + render :action => :show end # Can be create by normal user, # only UserkeyFlatDirSshDataProvider, S3FlatDataProvider, S3MultiLevelDataProvider def create_personal - @provider = DataProvider.new(base_provider_params).class_update - @provider.update_attributes(userkey_provider_params) if @provider.is_a?(UserkeyFlatDirSshDataProvider) - @provider.update_attributes(s3_provider_params) if @provider.is_a?(S3FlatDataProvider) - - authorized_type = [UserkeyFlatDirSshDataProvider, S3FlatDataProvider, S3MultiLevelDataProvider] - @provider.errors.add(:type, "is not allowed") unless authorized_type.include?(@provider.type) + @unsaved_meta = params[:meta] || {} + @provider = DataProvider.new(base_provider_params).class_update # Fix some attributes @provider.user_id = current_user.id @provider.group_id = current_user.own_group.id unless current_user.assignable_group_ids.include?(@provider.group_id) @provider.online = true - if ! @provider.save + @provider.update_attributes(userkey_provider_params) if @provider.is_a?(UserkeyFlatDirSshDataProvider) + @provider.update_attributes(s3_provider_params) if @provider.is_a?(S3FlatDataProvider) + + authorized_type = ["UserkeyFlatDirSshDataProvider", "S3FlatDataProvider", "S3MultiLevelDataProvider"] + @provider.errors.add(:type, "is not allowed") unless authorized_type.include?(@provider.type) + + if ! @provider.errors.empty? || ! @provider.save + @typelist = get_personal_type_list @groups = current_user.assignable_groups respond_to do |format| - format.html { render :action => :new_personal} + format.html { render :action => :show } format.json { render :json => @provider.errors, :status => :unprocessable_entity } end - return + return end @provider.addlog_context(self, "Created by #{current_user.login}") @@ -808,8 +829,30 @@ def get_type_list #:nodoc: grouped_options = data_provider_list.to_a.hashed_partitions { |name| name.constantize.pretty_category_name } grouped_options.delete(nil) # data providers that can not be on this list return a category name of nil, so we remove them grouped_options.keys.sort.map { |type| [ type, grouped_options[type].sort ] } + + return grouped_options || [] end + def get_personal_type_list #:nodoc: + data_provider_list = [ "FlatDirSshDataProvider" ] + data_provider_list = DataProvider.descendants.map(&:name) + + grouped_options = data_provider_list.to_a.hashed_partitions { |name| name.constantize.pretty_category_name } + # Keep only Cloud + grouped_options = grouped_options.select { |type, values| ["Cloud"].include?(type) } + # Remove S3DataProvider + grouped_options["Cloud"].reject! { |v| v == S3DataProvider.name } if grouped_options["Cloud"] + + # Add UserkeyFlatDirSshDataProvider group + category_of_userkey_dp = UserkeyFlatDirSshDataProvider.pretty_category_name + userkey_group = grouped_options.find { |type, _ | type == category_of_userkey_dp } || [] + userkey_group << UserkeyFlatDirSshDataProvider.name + grouped_options[category_of_userkey_dp] = userkey_group + + return grouped_options || [] + end + + # A name to store the scope for the browsing page; # a distinct scope is used for each distinct DP def browse_scope_name(provider) #:nodoc: diff --git a/BrainPortal/app/models/s3_flat_data_provider.rb b/BrainPortal/app/models/s3_flat_data_provider.rb index 7747302ce..10bf53617 100644 --- a/BrainPortal/app/models/s3_flat_data_provider.rb +++ b/BrainPortal/app/models/s3_flat_data_provider.rb @@ -53,6 +53,14 @@ class S3FlatDataProvider < DataProvider validates :cloud_storage_client_identifier, length: { in: 16..128 } validates :cloud_storage_client_token, length: { in: 20..100 } + # Attributes of: + # - SshDataProvider attributes (not appllicable to S3) + # - Containerized attributes (not applicable to S3) + # should be absent for this DP class. + validates :remote_user, :remote_host, :remote_port, :remote_dir, + :containerized_path, + absence: true + validates :cloud_storage_client_bucket_name, format: { with: /\A[A-Za-z0-9][A-Za-z0-9\-.]{1,61}[A-Za-z0-9]\z/, # this is good enough; DP will just crash on bad names message: "invalid S3 bucket name, for rules see https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-s3-bucket-naming-requirements.html" diff --git a/BrainPortal/app/models/ssh_data_provider.rb b/BrainPortal/app/models/ssh_data_provider.rb index 853794dee..ea2616131 100644 --- a/BrainPortal/app/models/ssh_data_provider.rb +++ b/BrainPortal/app/models/ssh_data_provider.rb @@ -35,6 +35,17 @@ class SshDataProvider < DataProvider include SshDataProviderBase + # Attributes of: + # - S3 attributes (not appllicable to Ssh) + # - Containerized attributes (not applicable to Ssh) + # should be absent for this DP class. + validates :cloud_storage_client_identifier, :cloud_storage_client_token, + :cloud_storage_client_bucket_name, :cloud_storage_client_path_start, + :cloud_storage_endpoint, :cloud_storage_region, + :containerized_path, + absence: true + + Revision_info=CbrainFileRevision[__FILE__] #:nodoc: # This returns the category of the data provider diff --git a/BrainPortal/app/views/data_providers/new.html.erb b/BrainPortal/app/views/data_providers/new.html.erb deleted file mode 100644 index c3aec765d..000000000 --- a/BrainPortal/app/views/data_providers/new.html.erb +++ /dev/null @@ -1,229 +0,0 @@ - -<%- -# -# CBRAIN Project -# -# Copyright (C) 2008-2012 -# The Royal Institution for the Advancement of Learning -# McGill University -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# 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 for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# --%> - -<% title 'Add New Data Provider' %> - -

Add New Data Provider

- -<%= error_messages_for(@provider) %> - -<%= form_for @provider, :as => :data_provider, :url => { :action => "create" }, :datatype => "script" do |f| -%> - -
- - -

<%= f.label :name, "Name" %>
- <%= f.text_field :name %>

-
- - -

<%= f.label :description, "Description" %>
- <%= f.text_area :description, :rows => 10, :cols => 40 %>
-

The first line should be a short summary, and the rest are for any special notes for the users.
-

-
- - -

<%= f.label :time_zone, "Time Zone" %>
- <%= f.time_zone_select :time_zone, - ActiveSupport::TimeZone.all.select { |t| t.name =~ /canada/i }, - { :default => ActiveSupport::TimeZone['Eastern Time (US & Canada)'], - :include_blank => true } - %>

-
- - - -

<%= f.label :type, "Type" %>
- <%= f.select :type, grouped_options_for_select(@typelist, @provider.type), { :prompt => "Select Provider Type" } %>
-

<%= show_hide_toggle "(Data Provider Type Information)", "#data_provider_classes", :class => 'action_link' %>
-

- - -
- - -

<%= f.label :user_id, "Owner" %>
- <%= user_select("data_provider[user_id]", { :selector => @provider }, { :disabled => ! current_user.has_role?(:admin_user) } ) %> -

-
- - -

<%= f.label :group_id, "Project" %>
- <%= group_select("data_provider[group_id]", :selector => @provider) %> -

-
- - -

<%= f.label :online, "Status" %>
- <%= f.select :online, { "Online" => true, "Offline" => false } %>

-
- - -

<%= f.label :read_only, "Mode" %>
- <%= f.select :read_only, { "Read/Write" => false, "Read Only" => true } %>

-
- - -

<%= f.label :not_syncable, "Syncability" %>
- <%= f.select :not_syncable, { "Fully syncable" => false, "NOT syncable" => true } %>

-
- -

- -

- SSH parameters for remote Data Providers - -
-

<%= f.label :remote_host, "Remote Hostname" %>
- <%= f.text_field :remote_host %>

-
- -
-

<%= f.label :alternate_host, "Alternate Hostname(s)" %>
- <%= f.text_field :alternate_host %>

-
- -
-

<%= f.label :remote_user, "Remote Username" %>
- <%= f.text_field :remote_user %>

-
- -
-

<%= f.label :remote_port, "Remote Port Number" %>
- <%= f.text_field :remote_port, :size => 6 %>

-
-
- -

- -

- Physical Data Location - - -

<%= f.label :remote_dir, "Full Directory Path" %>
- <%= f.text_field :remote_dir, :size => 80 %>

-
- -
- -

- -

- Containerized Storage Configuration - - -

<%= f.label :containerized_path, "Containerized Data Path" %>
- <%= f.text_field :containerized_path, :size => 80 %>

-
-
- -

- -

- Cloud Storage Configuration - - -

<%= f.label :cloud_storage_client_identifier, "Client Identifier" %>
- <%= f.text_field :cloud_storage_client_identifier, :size => 40, :autocomplete => 'off' %>

-
- - -

<%= f.label :cloud_storage_client_token, "Client Token" %>
- <%= f.password_field :cloud_storage_client_token, :size => 80, :autocomplete => 'off' %>

-
- - -

<%= f.label :cloud_storage_client_bucket_name, "Bucket Name (Only needed for S3FlatDataProvider)" %>
- <%= f.text_field :cloud_storage_client_bucket_name, :size => 80 %>

-
- Keep in mind, the bucket name should be specific enough to be unique to all of AWS. -
-
- - -

<%= f.label :cloud_storage_client_path_start, "Client Starting Path (Only needed for S3FlatDataProvider)" %>
- <%= f.text_field :cloud_storage_client_path_start, :size => 80 %>

-
- - -

<%= f.label :cloud_storage_endpoint, "Endpoint (Only needed for S3FlatDataProvider)" %>
- <%= f.text_field :cloud_storage_endpoint, :size => 80 %>

-
- - -

<%= f.label :cloud_storage_region, "Region (Only needed for S3FlatDataProvider)" %>
- <%= f.text_field :cloud_storage_region, :size => 80 %>

-
-
- -

- -

- Datalad Repository Configuration - - -

<%= f.label :datalad_repository_url, "Datalad URL" %>
- <%= f.text_field :datalad_repository_url, :size => 80 %>

-
- - -

<%= f.label :datalad_relative_path, "Datalad Relative Path" %>
- <%= f.text_field :datalad_relative_path, :size => 80 %>

-
-
- -

- -

- Other properties - -

- <%= check_box_tag 'meta[must_move]', "on", @provider.new_record? ? false : !@provider.meta[:must_move].blank? %> - -

- <%= group_select 'meta[browse_gid]', { :selector => (@provider.new_record? ? nil : @provider.meta[:browse_gid]) }, { :include_blank => "(Any Users)" } %> - -

- <%= check_box_tag 'meta[no_uploads]', "on", @provider.new_record? ? false : !@provider.meta[:no_uploads].blank? %> - -

- <%= check_box_tag 'meta[no_viewers]', "on", @provider.new_record? ? false : !@provider.meta[:no_viewers].blank? %> -

- - -
-

<%= submit_tag 'Create New Data Provider' %>

- -<% end %> - -
- - - - -
Public SSH Key for this CBRAIN Portal
This key should be installed on the host machines of SSH or Smart Data Providers to allow remote access.
<%= pretty_ssh_key(RemoteResource.current_resource.get_ssh_public_key || 'Unknown! Talk to sysadmin!') %>
-
diff --git a/BrainPortal/app/views/data_providers/new_personal.html.erb b/BrainPortal/app/views/data_providers/new_personal.html.erb deleted file mode 100644 index 204a1035a..000000000 --- a/BrainPortal/app/views/data_providers/new_personal.html.erb +++ /dev/null @@ -1,108 +0,0 @@ - -<%- -# -# CBRAIN Project -# -# Copyright (C) 2008-2023 -# The Royal Institution for the Advancement of Learning -# McGill University -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# 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 for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# --%> - -<% title 'Add New Personal Data Provider' %> - -

Add New Personal SSH-based Data Provider

- -<%= error_messages_for(@provider) %> - -<%= form_for @provider, :as => :data_provider, :url => { :action => "create_personal" }, :datatype => "script" do |f| -%> - - <% - # Note about the type: the form currently only supports the UserkeyFlatDirSshDataProvider - # but the controller also supports the S3MultiLevelDataProvider. Eventually we - # will allow both. If a user modifies the form in their browser they can still create - # their own S3 type, but that's ok. - %> - <%= hidden_field_tag 'data_provider[type]', 'UserkeyFlatDirSshDataProvider' %> - -
- -
- <%= f.label :name, "Name" %>
- <%= f.text_field :name %> -
This should be a simple identifier with no special characters or spaces
-
- -

- -

- <%= f.label :description, "Description" %>
- <%= f.text_area :description, :rows => 3, :cols => 85 %> -
The first line should be a short summary, and the rest are for any special notes for the users.
-
- -

- -

- <%= f.label :group_id, "Project" %>
- <%= group_select("data_provider[group_id]", { :groups => @groups, :selector => @provider.group_id.to_s }) %> -
This will control which users within CBRAIN can view and access the files on your storage. The default and recommended project is your own private project, '<%= current_user.own_group.name %>'.
-
- -

- -

- SSH parameters - -
- <%= f.label :remote_host, "Remote Hostname" %>
- <%= f.text_field :remote_host, :size => 40 %> -
- -

- -

- <%= f.label :remote_user, "Remote Username" %>
- <%= f.text_field :remote_user, :size => 40 %> -
- -

- -

- <%= f.label :remote_port, "Remote Port Number" %>
- <%= f.text_field :remote_port, :size => 6 %> -
- -

- -

- <%= f.label :remote_dir, "Full Directory Path" %>
- <%= f.text_field :remote_dir, :size => 80 %> -
- -
-
- -

- - <%= render :partial => 'show_user_key' %> - -

- - <%= submit_tag 'Create New Data Provider' %>

- -<% end %> - diff --git a/BrainPortal/app/views/data_providers/show.html.erb b/BrainPortal/app/views/data_providers/show.html.erb index fd5de1b3d..3cfe3cb48 100644 --- a/BrainPortal/app/views/data_providers/show.html.erb +++ b/BrainPortal/app/views/data_providers/show.html.erb @@ -22,14 +22,22 @@ # -%> -<% title 'Data Provider Info' %> - -<% has_owner_access = (check_role(:admin_user) || @provider.user_id == current_user.id) %> -<% is_userkey_dp = @provider.is_a?(UserkeyFlatDirSshDataProvider) %> -<% needs_ssh_config = @provider.is_a?(SshDataProvider) || @provider.is_a?(SmartDataProviderInterface) %> - - +<% end %>

@@ -64,226 +72,265 @@

- <%= show_table(@provider, :as => :data_provider, :edit_condition => has_owner_access) do |t| %> - - <% t.edit_cell(:name) do |f| %> - <%= f.text_field :name %> - <% end %> +<%= show_table_context(@provider, :url => url) do |cf| %> - <% t.edit_cell(:description, :content => full_description(@provider.description)) do |f| %> - <%= f.text_area :description, :rows => 10, :cols => 40 %>
- <% end %> + + <%= show_table(@provider, :form_helper => cf, :as => :data_provider, :edit_condition => has_owner_access) do |t| %> - <% if has_owner_access %> - <% t.attribute_cell(:type) %> - <% else %> - <% t.empty_cell %> - <% end %> - - <% t.edit_cell(:online, :content => (@provider.online ? "Online" : "Offline")) do |f| %> - <%= f.select :online, [["Online", true], ["Offline", false]] %> - <% end %> - - <% t.edit_cell(:user_id, :header => "Owner", :content => link_to_user_with_tooltip(@provider.user), :disabled => ! current_user.has_role?(:admin_user) ) do %> - <%= user_select("data_provider[user_id]", { :selector => @provider } ) %> - <% end %> - - <% t.edit_cell(:read_only, :content => (@provider.read_only ? "Read Only" : "Read/Write"), :header => "Mode") do |f| %> - <%= f.select :read_only, [["Read/Write", false], ["Read Only", true]] %> - <% end %> + <% t.edit_cell(:name) do |f| %> + <%= f.text_field :name %> + <% end %> - <% t.edit_cell(:group_id, :header => "Project", :content => link_to_group_if_accessible(@provider.group) ) do %> - <%= group_select("data_provider[group_id]", { :selector => @provider }) %> - <% end %> + <% t.edit_cell(:description, :content => full_description(@provider.description)) do |f| %> + <%= f.text_area :description, :rows => 10, :cols => 40 %>
+ <% end %> - <% t.edit_cell(:not_syncable, :content => (@provider.not_syncable ? "NOT syncable" : "Fully syncable"), :header => "Syncability") do |f| %> - <%= f.select :not_syncable, [["Fully syncable", false], ["NOT syncable", true]] %> - <% end %> + <% if is_new_record || has_owner_access %> + <% t.edit_cell(:type, :content => @provider.type) do |f| %> + <%= f.select :type, grouped_options_for_select(@typelist, @provider.type) %> + <% if !is_normal_user %> + <%= overlay_ajax_link "(Data Provider Type Information)", "/doc/data_providers/data_provider_info.html", :class => "help_link" %> + <% end %> + <% end %> + <% else %> + <% t.empty_cell %> + <% end %> - <% if current_user.has_role?(:admin_user) %> - <% t.cell("Revision Info (DataProvider)", :show_width => 2) { DataProvider.revision_info.format() } %> - <% t.cell("Revision Info (#{@provider.type})", :show_width => 2) { @provider.revision_info.format() } %> - <% end %> + <% t.edit_cell(:online, :content => (@provider.online ? "Online" : "Offline")) do |f| %> + <%= f.select :online, [["Online", true], ["Offline", false]] %> + <% end %> - <% if ! is_userkey_dp %> - <% t.edit_cell(:time_zone, :content => (@provider.time_zone || "(Unset)"), :show_width => 2 ) do |f| %> - <%= f.select :time_zone, time_zone_options_for_select(@provider.time_zone, /canada/i), :include_blank => true %> + <% t.edit_cell(:user_id, :header => "Owner", :content => link_to_user_with_tooltip(@provider.user), :disabled => ! current_user.has_role?(:admin_user) ) do %> + <%= user_select("data_provider[user_id]", { :selector => @provider } ) %> <% end %> - <% end %> - <% if has_owner_access %> - <% t.edit_cell(:remote_dir, :header => "Physical Data Location", :show_width => 2) do |f| %> - <%= f.text_field :remote_dir, :size => 80 %> + <% t.edit_cell(:read_only, :content => (@provider.read_only ? "Read Only" : "Read/Write"), :header => "Mode") do |f| %> + <%= f.select :read_only, [["Read/Write", false], ["Read Only", true]] %> <% end %> - <% end %> - <% if current_user.has_role?(:admin_user) %> - <% joint_licenses = @provider.license_agreements.join("\n") %> - <% licenses = @provider.license_agreements.count == 0 ? "(None)": @provider.license_agreements.join("\n") %> - <% t.edit_cell(:license_agreements, :content => licenses, :show_width => 2) do |f| %> - <%= f.text_area :license_agreements, :value => joint_licenses, :content => joint_licenses, :rows => 5, :cols => 40 %>
-
Enter one agreement name per line. Note that only alphanumeric characters, underscores (_) and dashes (-) are accepted.
- <% end %> - <% else %> - <% t.empty_cell %> - <% end %> + <% t.edit_cell(:group_id, :header => "Project", :content => link_to_group_if_accessible(@provider.group) ) do %> + <%= group_select("data_provider[group_id]", { :selector => @provider }) %> + <% end %> - <% end %> + <% t.edit_cell(:not_syncable, :content => (@provider.not_syncable ? "NOT syncable" : "Fully syncable"), :header => "Syncability") do |f| %> + <%= f.select :not_syncable, [["Fully syncable", false], ["NOT syncable", true]] %> + <% end %> - <% if has_owner_access && needs_ssh_config %> - <%= show_table(@provider, :as => :data_provider, :header => "SSH parameters", :edit_condition => true) do |t| %> - <% t.edit_cell(:remote_host, :show_width => 2) do |f| %> - <%= f.text_field :remote_host, :size => 40 %> + <% if current_user.has_role?(:admin_user) %> + <% t.cell("Revision Info (DataProvider)", :show_width => 2) { DataProvider.revision_info.format() } %> + <% t.cell("Revision Info (#{@provider.type})", :show_width => 2) { @provider.revision_info.format() } %> <% end %> - <% if check_role(:admin_user) %> - <% t.edit_cell(:alternate_host, :show_width => 2, :header => "Alternate hostname(s)") do |f| %> - <%= f.text_field :alternate_host, :size => 100 %>
-
Comma-separated list of alternate hostnames; hostname1,hostname2,hostname3,...
+ + <% if ! is_userkey_dp %> + <% t.edit_cell(:time_zone, :content => (@provider.time_zone || "(Unset)"), :show_width => 2 ) do |f| %> + <%= f.select :time_zone, time_zone_options_for_select(@provider.time_zone, /canada/i), :include_blank => true %> <% end %> <% end %> - <% t.edit_cell(:remote_user) do |f| %> - <%= f.text_field :remote_user, :size => 40 %> - <% end %> - <% t.edit_cell(:remote_port) do |f| %> - <%= f.text_field :remote_port, :size => 6 %> + + <% if is_new_record || has_owner_access %> + <% t.edit_cell(:remote_dir, :header => "Physical Data Location", :show_width => 2) do |f| %> + <%= f.text_field :remote_dir, :size => 80 %> + <% end %> <% end %> - <% end %> - <% end %> - <% if @provider.is_a?(SingSquashfsDataProvider) || @provider.is_a?(SingBindmountDataProvider) %> - <%= show_table(@provider, :as => :data_provider, :header => "Containerized Storage Configuration", :edit_condition => true) do |t| %> - <% t.edit_cell(:containerized_path, :header => 'Containerized Data Path', :show_width => 2) do %> - <%= text_field_tag "data_provider[containerized_path]", @provider.containerized_path, :size => 80 %> + <% if current_user.has_role?(:admin_user) %> + <% joint_licenses = @provider.license_agreements.join("\n") %> + <% licenses = @provider.license_agreements.count == 0 ? "(None)": @provider.license_agreements.join("\n") %> + <% t.edit_cell(:license_agreements, :content => licenses, :show_width => 2) do |f| %> + <%= f.text_area :license_agreements, :value => joint_licenses, :content => joint_licenses, :rows => 5, :cols => 40 %>
+
Enter one agreement name per line. Note that only alphanumeric characters, underscores (_) and dashes (-) are accepted.
+ <% end %> + <% else %> + <% t.empty_cell %> <% end %> + <% end %> - <% end %> - <% if @provider.is_a?(S3DataProvider) || @provider.is_a?(S3FlatDataProvider) %> - <%= show_table(@provider, :as => :data_provider, :header => "Cloud Storage Configuration", :edit_condition => true) do |t| %> - <% t.edit_cell(:cloud_storage_client_identifier, :header => 'Client Identifier', :show_width => 2) do |f| %> - <%= f.text_field :cloud_storage_client_identifier, :size => 40, :autocomplete => 'off' %> - <% end %> - <% t.edit_cell(:cloud_storage_client_token, :content => '****************', :header => 'Client Token', :show_width => 2) do |f| %> - <%= f.password_field :cloud_storage_client_token, :size => 80, :autocomplete => 'off' %> - <% end %> - <% t.edit_cell(:cloud_storage_client_bucket_name, :header => 'Client Bucket Name', :show_width => 2) do %> - <%= text_field_tag "data_provider[cloud_storage_client_bucket_name]", @provider.cloud_storage_client_bucket_name, :size => 80 %> - <% end %> - <% t.edit_cell(:cloud_storage_client_path_start, :header => 'Client Starting Path', :show_width => 2) do %> - <%= text_field_tag "data_provider[cloud_storage_client_path_start]", @provider.cloud_storage_client_path_start, :size => 80 %> - <% end %> - <% t.edit_cell(:cloud_storage_endpoint, :header => 'Endpoint', :show_width => 2) do %> - <%= text_field_tag "data_provider[cloud_storage_endpoint]", @provider.cloud_storage_endpoint, :size => 80 %> - <% end %> - <% t.edit_cell(:cloud_storage_region, :header => 'Region', :show_width => 2) do %> - <%= text_field_tag "data_provider[cloud_storage_region]", @provider.cloud_storage_region, :size => 80 %> + + + <% if is_new_record || (has_owner_access && needs_ssh_config) %> + <%= show_table(@provider, :form_helper => cf, :as => :data_provider, :header => "SSH parameters", :edit_condition => true) do |t| %> + + <% t.edit_cell(:remote_host, :show_width => 2) do |f| %> + <%= f.text_field :remote_host, :size => 40 %> + <% end %> + + <% if check_role(:admin_user) %> + <% t.edit_cell(:alternate_host, :show_width => 2, :header => "Alternate hostname(s)") do |f| %> + <%= f.text_field :alternate_host, :size => 100 %>
+
Comma-separated list of alternate hostnames; hostname1,hostname2,hostname3,...
+ <% end %> + <% end %> + + <% t.edit_cell(:remote_user) do |f| %> + <%= f.text_field :remote_user, :size => 40 %> + <% end %> + + <% t.edit_cell(:remote_port) do |f| %> + <%= f.text_field :remote_port, :size => 6 %> + <% end %> + <% end %> <% end %> - <% end %> - <% if @provider.is_a?(DataladDataProvider) %> - <%= show_table(@provider, :as => :data_provider, :header => "Datalad Configuration", :edit_condition => true) do |t| %> - <% t.edit_cell(:datalad_repository_url, :header => 'Datalad Repository URL', :show_width => 2) do |f| %> - <%= f.text_field :datalad_repository_url %> - <% end %> - <% t.edit_cell(:datalad_relative_path, :header => 'Datalad Relative Path', :show_width => 2) do |f| %> - <%= f.text_field :datalad_relative_path %> + + <% if ( !@is_personal && is_new_record || (@provider.is_a?(SingSquashfsDataProvider) || @provider.is_a?(SingBindmountDataProvider))) %> + + <%= show_table(@provider, :form_helper => cf, :as => :data_provider, :header => "Containerized Storage Configuration", :edit_condition => true) do |t| %> + <% t.edit_cell(:containerized_path, :header => 'Containerized Data Path', :show_width => 2) do %> + <%= text_field_tag "data_provider[containerized_path]", @provider.containerized_path, :size => 80 %> + <% end %> <% end %> + <% end %> - <% end %> + + <% if @provider.is_a?(S3DataProvider) || @provider.is_a?(S3FlatDataProvider) || (is_new_record && @typelist.include?("Cloud")) %> - <%= show_table(@provider, :as => :data_provider, :header => "Other Properties", :edit_condition => (check_role(:admin_user) || @provider.user_id == current_user.id)) do |t| %> + <%= show_table(@provider, :form_helper => cf, :as => :data_provider, :header => "Cloud Storage Configuration", :edit_condition => true) do |t| %> - <% t.boolean_edit_cell("meta[no_uploads]", @provider.meta["no_uploads"], "on", "", :header => "Cannot be used for uploading files in the file manager") %> + <% t.edit_cell(:cloud_storage_client_identifier, :header => 'Client Identifier', :show_width => 2) do |f| %> + <%= f.text_field :cloud_storage_client_identifier, :size => 40, :autocomplete => 'off' %> + <% end %> - <% t.boolean_edit_cell("meta[no_viewers]", @provider.meta["no_viewers"], "on", "", :header => "Files cannot be viewed in the file manager") %> + <% t.edit_cell(:cloud_storage_client_token, :content => '****************', :header => 'Client Token', :show_width => 2) do |f| %> + <%= f.password_field :cloud_storage_client_token, :size => 80, :autocomplete => 'off' %> + <% end %> - <% if @provider.is_browsable? %> + <% t.edit_cell(:cloud_storage_client_bucket_name, :header => 'Client Bucket Name' + (is_new_record ? '' : ' (Only needed for S3FlatDataProvider)'), :show_width => 2) do |f| %> + <%= f.text_field :cloud_storage_client_bucket_name, :size => 80 %> + <% end %> - <% t.boolean_edit_cell("meta[must_move]", @provider.meta["must_move"], "on", "", :header => "Files must be copied/moved upon registration") %> + <% t.edit_cell(:cloud_storage_client_path_start, :header => 'Client Starting Path' + (is_new_record ? '' : ' (Only needed for S3FlatDataProvider)'), :show_width => 2) do |f| %> + <%= f.text_field :cloud_storage_client_path_start, :size => 80 %> + <% end %> + + <% t.edit_cell(:cloud_storage_endpoint, :header => 'Endpoint' + (is_new_record ? '' : ' (Only needed for S3FlatDataProvider)'), :show_width => 2) do |f| %> + <%= f.text_field :cloud_storage_endpoint, :size => 80 %> + <% end %> + + <% t.edit_cell(:cloud_storage_region, :header => 'Region' + (is_new_record ? '' : ' (Only needed for S3FlatDataProvider)'), :show_width => 2) do |f| %> + <%= f.text_field :cloud_storage_region, :size => 80 %> + <% end %> - <% t.edit_cell("meta[browse_gid]", - :header => "Files can be browsed only by members of this project", - :content => @provider.meta[:browse_gid].present? ? link_to_group_if_accessible(@provider.meta[:browse_gid]) : '(Any Users)', - :show_width => 2 - ) do %> - <%= group_select 'meta[browse_gid]', { :selector => @provider.meta[:browse_gid] }, { :include_blank => "(Any Users)" } %> <% end %> + <% end %> + + + <% if @provider.is_a?(DataladDataProvider) || (is_new_record && @typelist.include?("DataladProvider")) %> + + <%= show_table(@provider, :form_helper => cf, :as => :data_provider, :header => "Datalad Configuration", :edit_condition => true) do |t| %> + <% t.edit_cell(:datalad_repository_url, :header => 'Datalad Repository URL', :show_width => 2) do |f| %> + <%= f.text_field :datalad_repository_url %> + <% end %> + + <% t.edit_cell(:datalad_relative_path, :header => 'Datalad Relative Path', :show_width => 2) do |f| %> + <%= f.text_field :datalad_relative_path %> + <% end %> + + <% end %> <% end %> - <% end %> + + <% if !@is_personal %> + <%= show_table(@provider, :form_helper => cf, :as => :data_provider, :header => "Other Properties", :edit_condition => (check_role(:admin_user) || @provider.user_id == current_user.id)) do |t| %> + <% t.boolean_edit_cell("meta[no_uploads]", is_new_record ? @unsaved_meta[:no_uploads] || false : @provider.meta[:no_uploads], "on", "", :header => "Cannot be used for uploading files in the file manager") %> + <% t.boolean_edit_cell("meta[no_viewers]", is_new_record ? @unsaved_meta[:no_viewers] || false : @provider.meta[:no_viewers], "on", "", :header => "Files cannot be viewed in the file manager") %> - <% other_dps = DataProvider.find_all_accessible_by_user(current_user).reject { |dp| dp.id == @provider.id } %> - <% dps_by_category = other_dps.to_a.hashed_partitions { |dp| dp.is_browsable? ? :user : :official } %> + <% if is_new_record || @provider.is_browsable? %> - <% if other_dps.size > 0 %> + <% t.boolean_edit_cell("meta[must_move]", is_new_record ? @unsaved_meta[:must_move] || false : @provider.meta[:must_move], "on", "", :header => "Files must be copied/moved upon registration") %> - <%= show_table(@provider, :as => :data_provider, :width => 5, :header => 'Files can be copied or moved to these other Data Providers', :edit_condition => (check_role(:admin_user) || @provider.user_id == current_user.id)) do |t| %> - <% if dps_by_category[:official] %> - <% t.row(:class => 'subheader') { "Official Storage".html_safe } %> - <% dps_by_category[:official].sort_by(&:name).each do |dp| %> - <% meta_key = "dp_no_copy_#{dp.id}" %> - <% t.boolean_edit_cell("meta[#{meta_key}]", @provider.meta[meta_key].to_s, "", "disabled", :header => "#{dp.name}", :class => 'checkbox_label') %> - <% end%> - <% end%> + <% browse_gid = !is_new_record ? @provider.meta[:browse_gid].present? : (@unsaved_meta && @unsaved_meta[:browse_gid].present?) %> + <% t.edit_cell("meta[browse_gid]", + :header => "Files can be browsed only by members of this project", + :content => !is_new_record && browse_gid ? link_to_group_if_accessible(@provider.meta[:browse_gid]) : '(Any Users)', + :show_width => 2 + ) do %> + <%= group_select 'meta[browse_gid]', { :selector => (is_new_record ? @unsaved_meta[:browse_gid] : @provider.meta[:browse_gid]) }, { :include_blank => "(Any Users)" } %> + <% end %> - <% t.blank_row %> + <% end %> + <% end %> - <% if dps_by_category[:user] %> - <% t.row(:class => 'subheader') { "User or Site Storage".html_safe } %> - <% dps_by_category[:user].sort_by(&:name).each do |dp| %> - <% meta_key = "dp_no_copy_#{dp.id}" %> - <% t.boolean_edit_cell("meta[#{meta_key}]", @provider.meta[meta_key].to_s, "", "disabled", :header => "#{dp.name}", :class => 'checkbox_label') %> + + <% other_dps = DataProvider.find_all_accessible_by_user(current_user).reject { |dp| dp.id == @provider.id } %> + <% dps_by_category = other_dps.to_a.hashed_partitions { |dp| dp.is_browsable? ? :user : :official } %> + + <% if other_dps.size > 0 %> + + <%= show_table(@provider, :form_helper => cf, :as => :data_provider, :width => 5, :header => 'Files can be copied or moved to these other Data Providers', :edit_condition => (check_role(:admin_user) || @provider.user_id == current_user.id)) do |t| %> + <% if dps_by_category[:official] %> + <% t.row(:class => 'subheader') { "Official Storage".html_safe } %> + <% dps_by_category[:official].sort_by(&:name).each do |dp| %> + <% meta_key = "dp_no_copy_#{dp.id}" %> + <% t.boolean_edit_cell("meta[#{meta_key}]", is_new_record ? @unsaved_meta[meta_key] || false : @provider.meta[meta_key].to_s, "", "disabled", :header => "#{dp.name}", :class => 'checkbox_label') %> + <% end%> + <% end%> + + <% t.blank_row %> + + <% if dps_by_category[:user] %> + <% t.row(:class => 'subheader') { "User or Site Storage".html_safe } %> + <% dps_by_category[:user].sort_by(&:name).each do |dp| %> + <% meta_key = "dp_no_copy_#{dp.id}" %> + <% t.boolean_edit_cell("meta[#{meta_key}]", is_new_record ? @unsaved_meta[meta_key] || false : @provider.meta[meta_key].to_s, "", "disabled", :header => "#{dp.name}", :class => 'checkbox_label') %> + <% end%> + <% end%> <% end%> <% end%> + <% end%> - <% end%> - <% other_rrs = RemoteResource.find_all_accessible_by_user(current_user) %> - <% rrs_by_category = other_rrs.to_a.hashed_partitions { |rr| rr.is_a?(Bourreau) ? :bourreau : :portal } %> + + <% other_rrs = RemoteResource.find_all_accessible_by_user(current_user) %> + <% rrs_by_category = other_rrs.to_a.hashed_partitions { |rr| rr.is_a?(Bourreau) ? :bourreau : :portal } %> - <% if other_rrs.size > 0 %> + <% if other_rrs.size > 0 %> - <%= show_table(@provider, :as => :data_provider, :width => 5, :header => 'File contents can be accessed by these Servers', :edit_condition => (check_role(:admin_user) || @provider.user_id == current_user.id)) do |t| %> - <% if rrs_by_category[:portal] %> - <% t.row(:class => 'subheader') { "Portals".html_safe } %> - <% rrs_by_category[:portal].sort_by(&:name).each do |rr| %> - <% meta_key = "rr_no_sync_#{rr.id}" %> - <% t.boolean_edit_cell("meta[#{meta_key}]", @provider.meta[meta_key].to_s, "", "#{rr.name} cannot sync #{@provider.name}", :header => "#{rr.name}", :class => 'checkbox_label') %> + <%= show_table(@provider, :form_helper => cf, :as => :data_provider, :width => 5, :header => 'File contents can be accessed by these Servers', :edit_condition => (check_role(:admin_user) || @provider.user_id == current_user.id)) do |t| %> + <% if rrs_by_category[:portal] %> + <% t.row(:class => 'subheader') { "Portals".html_safe } %> + <% rrs_by_category[:portal].sort_by(&:name).each do |rr| %> + <% meta_key = "rr_no_sync_#{rr.id}" %> + <% t.boolean_edit_cell("meta[#{meta_key}]", is_new_record ? @unsaved_meta[meta_key].to_s : @provider.meta[meta_key].to_s, "", "#{rr.name} cannot sync #{@provider.name}", :header => "#{rr.name}", :class => 'checkbox_label') %> + <% end%> <% end%> - <% end%> - <% t.blank_row %> + <% t.blank_row %> - <% if rrs_by_category[:bourreau] %> - <% t.row(:class => 'subheader') { "Execution Servers".html_safe } %> - <% rrs_by_category[:bourreau].sort_by(&:name).each do |rr| %> - <% meta_key = "rr_no_sync_#{rr.id}" %> - <% t.boolean_edit_cell("meta[#{meta_key}]", @provider.meta[meta_key].to_s, "", "#{rr.name} cannot sync #{@provider.name}", :header => "#{rr.name}", :class => 'checkbox_label') %> + <% if rrs_by_category[:bourreau] %> + <% t.row(:class => 'subheader') { "Execution Servers".html_safe } %> + <% rrs_by_category[:bourreau].sort_by(&:name).each do |rr| %> + <% meta_key = "rr_no_sync_#{rr.id}" %> + <% t.boolean_edit_cell("meta[#{meta_key}]", is_new_record ? @unsaved_meta[meta_key].to_s : @provider.meta[meta_key].to_s, "", "#{rr.name} cannot sync #{@provider.name}", :header => "#{rr.name}", :class => 'checkbox_label') %> + <% end%> <% end%> <% end%> <% end%> - <% end%> + <% end %>

<% if has_owner_access %> - <% if is_userkey_dp %> + <% if include_personal_ssh %> <%= render :partial => 'show_user_key' %> - <% elsif needs_ssh_config %> -

- - - - -
Public SSH Key for this CBRAIN Portal
This key should be installed on this Data Provider's host machine to allow remote access.
<%= pretty_ssh_key(RemoteResource.current_resource.get_ssh_public_key || 'Unknown! Talk to sysadmin!') %>
-
+ <% end %> + + <% if needs_ssh_config || (is_new_record && include_ssh) %> +
+
+ + + + +
Public SSH Key for this CBRAIN Portal
This key should be installed on this Data Provider's host machine to allow remote access.
<%= pretty_ssh_key(RemoteResource.current_resource.get_ssh_public_key || 'Unknown! Talk to sysadmin!') %>
+
<% end %>

diff --git a/BrainPortal/app/views/data_providers/_dp_types_explained.html.erb b/BrainPortal/public/doc/data_providers/dp_types_explained.html similarity index 100% rename from BrainPortal/app/views/data_providers/_dp_types_explained.html.erb rename to BrainPortal/public/doc/data_providers/dp_types_explained.html diff --git a/BrainPortal/spec/controllers/data_providers_controller_spec.rb b/BrainPortal/spec/controllers/data_providers_controller_spec.rb index 4897be9f4..dad0ad97d 100644 --- a/BrainPortal/spec/controllers/data_providers_controller_spec.rb +++ b/BrainPortal/spec/controllers/data_providers_controller_spec.rb @@ -58,9 +58,9 @@ expect(controller).to receive(:get_type_list) get :new end - it "should render the new page" do + it "should render the show page" do get :new - expect(response).to render_template(:new) + expect(response).to render_template(:show) end end describe "create" do @@ -96,9 +96,9 @@ expect(controller).not_to receive(:add_meta_data_from_form) post :create, :xhr => true end - it "should render new page again" do + it "should render show page again" do post :create, :xhr => true - expect(response).to render_template(:new) + expect(response).to render_template(:show) end end end