From c66b6d234e1344218e03d1b8a947ca070148ffd7 Mon Sep 17 00:00:00 2001 From: Mike DeAngelo Date: Fri, 5 May 2023 14:37:29 -0400 Subject: [PATCH] feat: dashboard import_lookml --- lib/gzr/commands/dashboard.rb | 16 +++++ lib/gzr/commands/dashboard/import_lookml.rb | 72 +++++++++++++++++++++ lib/gzr/modules/dashboard.rb | 10 +++ 3 files changed, 98 insertions(+) create mode 100644 lib/gzr/commands/dashboard/import_lookml.rb diff --git a/lib/gzr/commands/dashboard.rb b/lib/gzr/commands/dashboard.rb index 1127dc7..dd95366 100644 --- a/lib/gzr/commands/dashboard.rb +++ b/lib/gzr/commands/dashboard.rb @@ -96,6 +96,22 @@ def rm(id) Gzr::Commands::Dashboard::Rm.new(id, options).execute end end + + desc 'import_lookml DASHBOARD_ID TARGET_FOLDER_ID', 'Create a UDD from a lookml dashboard in the given folder' + method_option :help, aliases: '-h', type: :boolean, + desc: 'Display usage information' + method_option :unlink, type: :boolean, + desc: 'Unlink the new user defined dashboard from the LookML dashboard' + method_option :force, type: :boolean, + desc: 'Overwrite a dashboard with the same name in the target folder' + def import_lookml(dashboard_id, target_folder_id) + if options[:help] + invoke :help, ['import_lookml'] + else + require_relative 'dashboard/import_lookml' + Gzr::Commands::Dashboard::ImportLookml.new(dashboard_id, target_folder_id, options).execute + end + end end end end diff --git a/lib/gzr/commands/dashboard/import_lookml.rb b/lib/gzr/commands/dashboard/import_lookml.rb new file mode 100644 index 0000000..5045210 --- /dev/null +++ b/lib/gzr/commands/dashboard/import_lookml.rb @@ -0,0 +1,72 @@ +# The MIT License (MIT) + +# Copyright (c) 2023 Mike DeAngelo Google, Inc. + +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +# frozen_string_literal: true + +require_relative '../../../gzr' +require_relative '../../command' +require_relative '../../modules/dashboard' + +module Gzr + module Commands + class Dashboard + class ImportLookml < Gzr::Command + include Gzr::Dashboard + def initialize(dashboard_id, target_folder_id, options) + super() + @dashboard_id = dashboard_id + @target_folder_id = target_folder_id + @options = options + end + + def execute(input: $stdin, output: $stdout) + say_warning("options: #{@options.inspect}", output: output) if @options[:debug] + with_session do + + dash = query_dashboard(@dashboard_id) + raise Gzr::CLI::Error, "Dashboard with id #{@dashboard_id} does not exist" unless dash + + matching_title = search_dashboards_by_title(dash[:title],@target_folder_id) + if matching_title.empty? || matching_title.first[:deleted] + matching_title = false + end + + if matching_title + raise Gzr::CLI::Error, "Dashboard #{dash[:title]} already exists in folder #{@target_folder_id}\nUse --force if you want to overwrite it" unless @options[:force] + say_ok "Deleting existing dashboard #{matching_title.first[:id]} #{matching_title.first[:title]} in folder #{@target_folder_id}", output: output + update_dashboard(matching_title.first[:id],{:deleted=>true}) + end + + new_dash = import_lookml_dashboard(@dashboard_id,@target_folder_id) + + if @options[:unlink] + body = {} + body[:lookml_link_id] = nil + update_dashboard(new_dash[:id],body) + end + output.puts "Created user defined dashboard #{new_dash[:id]} in folder #{@target_folder_id}" unless @options[:plain] + output.puts new_dash[:id] if @options[:plain] + end + end + end + end + end +end diff --git a/lib/gzr/modules/dashboard.rb b/lib/gzr/modules/dashboard.rb index e68055f..e273002 100644 --- a/lib/gzr/modules/dashboard.rb +++ b/lib/gzr/modules/dashboard.rb @@ -354,5 +354,15 @@ def trim_dashboard(data) trimmed end + + def import_lookml_dashboard(id,folder) + begin + return @sdk.import_lookml_dashboard(id,folder)&.to_attrs + rescue LookerSDK::Error => e + say_error "Error import_lookml_dashboard(#{id},#{folder})" + say_error e + raise + end + end end end