func editDashboardsCmd()

in cmd/edit.go [51:139]


func editDashboardsCmd(cmd *cobra.Command, args []string) error {
	cmd.Println("Make Kibana dashboards editable")

	dashboardIDs, err := cmd.Flags().GetStringSlice(cobraext.DashboardIDsFlagName)
	if err != nil {
		return cobraext.FlagParsingError(err, cobraext.DashboardIDsFlagName)
	}

	common.TrimStringSlice(dashboardIDs)

	var opts []kibana.ClientOption
	tlsSkipVerify, _ := cmd.Flags().GetBool(cobraext.TLSSkipVerifyFlagName)
	if tlsSkipVerify {
		opts = append(opts, kibana.TLSSkipVerify())
	}

	allowSnapshot, _ := cmd.Flags().GetBool(cobraext.AllowSnapshotFlagName)
	if err != nil {
		return cobraext.FlagParsingError(err, cobraext.AllowSnapshotFlagName)
	}

	profile, err := cobraext.GetProfileFlag(cmd)
	if err != nil {
		return err
	}

	kibanaClient, err := stack.NewKibanaClientFromProfile(profile, opts...)
	if err != nil {
		return fmt.Errorf("can't create Kibana client: %w", err)
	}

	kibanaVersion, err := kibanaClient.Version()
	if err != nil {
		return fmt.Errorf("can't get Kibana status information: %w", err)
	}

	if kibanaVersion.IsSnapshot() {
		message := fmt.Sprintf("editing dashboards from a SNAPSHOT version of Kibana (%s) is discouraged. It could lead to invalid dashboards (for example if they use features that are reverted or modified before the final release)", kibanaVersion.Version())
		if !allowSnapshot {
			return fmt.Errorf("%s. --%s flag can be used to ignore this error", message, cobraext.AllowSnapshotFlagName)
		}
		fmt.Printf("Warning: %s\n", message)
	}

	if len(dashboardIDs) == 0 {
		dashboardIDs, err = promptDashboardIDs(cmd.Context(), kibanaClient)
		if err != nil {
			return fmt.Errorf("prompt for dashboard selection failed: %w", err)
		}

		if len(dashboardIDs) == 0 {
			fmt.Println("No dashboards were found in Kibana.")
			return nil
		}
	}

	updatedDashboardIDs := make([]string, 0, len(dashboardIDs))
	failedDashboardUpdates := make(map[string]error, len(dashboardIDs))
	for _, dashboardID := range dashboardIDs {
		err = kibanaClient.SetManagedSavedObject(cmd.Context(), "dashboard", dashboardID, false)
		if err != nil {
			failedDashboardUpdates[dashboardID] = err
		} else {
			updatedDashboardIDs = append(updatedDashboardIDs, dashboardID)
		}
	}

	if len(updatedDashboardIDs) > 0 {
		urls, err := dashboardURLs(*kibanaClient, updatedDashboardIDs)
		if err != nil {
			cmd.Println(fmt.Sprintf("\nFailed to retrieve dashboard URLS: %s", err.Error()))
			cmd.Println(fmt.Sprintf("The following dashboards are now editable in Kibana:\n%s", strings.Join(updatedDashboardIDs, "\n")))
		} else {
			cmd.Println(fmt.Sprintf("\nThe following dashboards are now editable in Kibana:%s\n\nRemember to export modified dashboards with elastic-package export dashboards", urls))
		}
	}

	if len(failedDashboardUpdates) > 0 {
		var combinedErr error
		for _, err := range failedDashboardUpdates {
			combinedErr = errors.Join(combinedErr, err)
		}
		fmt.Println("")
		return fmt.Errorf("failed to make one or more dashboards editable: %s", combinedErr.Error())
	}

	fmt.Println("\nDone")
	return nil
}