diff --git a/.gitattributes b/.gitattributes index 7f606e06..6afe6939 100755 --- a/.gitattributes +++ b/.gitattributes @@ -13,6 +13,7 @@ cmd/account/networks/networks.go linguist-generated=true cmd/account/o-auth-enrollment/o-auth-enrollment.go linguist-generated=true cmd/account/private-access/private-access.go linguist-generated=true cmd/account/published-app-integration/published-app-integration.go linguist-generated=true +cmd/account/service-principal-secrets/service-principal-secrets.go linguist-generated=true cmd/account/service-principals/service-principals.go linguist-generated=true cmd/account/storage-credentials/storage-credentials.go linguist-generated=true cmd/account/storage/storage.go linguist-generated=true @@ -64,5 +65,6 @@ cmd/workspace/tokens/tokens.go linguist-generated=true cmd/workspace/users/users.go linguist-generated=true cmd/workspace/volumes/volumes.go linguist-generated=true cmd/workspace/warehouses/warehouses.go linguist-generated=true +cmd/workspace/workspace-bindings/workspace-bindings.go linguist-generated=true cmd/workspace/workspace-conf/workspace-conf.go linguist-generated=true cmd/workspace/workspace/workspace.go linguist-generated=true diff --git a/cmd/account/cmd.go b/cmd/account/cmd.go index 52c605cb..b392aa38 100644 --- a/cmd/account/cmd.go +++ b/cmd/account/cmd.go @@ -20,6 +20,7 @@ import ( o_auth_enrollment "github.com/databricks/cli/cmd/account/o-auth-enrollment" private_access "github.com/databricks/cli/cmd/account/private-access" published_app_integration "github.com/databricks/cli/cmd/account/published-app-integration" + service_principal_secrets "github.com/databricks/cli/cmd/account/service-principal-secrets" account_service_principals "github.com/databricks/cli/cmd/account/service-principals" storage "github.com/databricks/cli/cmd/account/storage" account_storage_credentials "github.com/databricks/cli/cmd/account/storage-credentials" @@ -51,6 +52,7 @@ func init() { accountCmd.AddCommand(o_auth_enrollment.Cmd) accountCmd.AddCommand(private_access.Cmd) accountCmd.AddCommand(published_app_integration.Cmd) + accountCmd.AddCommand(service_principal_secrets.Cmd) accountCmd.AddCommand(account_service_principals.Cmd) accountCmd.AddCommand(storage.Cmd) accountCmd.AddCommand(account_storage_credentials.Cmd) diff --git a/cmd/account/custom-app-integration/custom-app-integration.go b/cmd/account/custom-app-integration/custom-app-integration.go index 62c735db..ca2fe913 100755 --- a/cmd/account/custom-app-integration/custom-app-integration.go +++ b/cmd/account/custom-app-integration/custom-app-integration.go @@ -46,7 +46,8 @@ var createCmd = &cobra.Command{ Create Custom OAuth App Integration. - You can retrieve the custom oauth app integration via :method:get.`, + You can retrieve the custom oauth app integration via + :method:CustomAppIntegration/get.`, Annotations: map[string]string{}, PreRunE: root.MustAccountClient, @@ -87,7 +88,7 @@ var deleteCmd = &cobra.Command{ Long: `Delete Custom OAuth App Integration. Delete an existing Custom OAuth App Integration. You can retrieve the custom - oauth app integration via :method:get.`, + oauth app integration via :method:CustomAppIntegration/get.`, Annotations: map[string]string{}, Args: cobra.ExactArgs(1), @@ -151,7 +152,7 @@ var listCmd = &cobra.Command{ Long: `Get custom oauth app integrations. Get the list of custom oauth app integrations for the specified Databricks - Account`, + account`, Annotations: map[string]string{}, PreRunE: root.MustAccountClient, @@ -187,7 +188,7 @@ var updateCmd = &cobra.Command{ Long: `Updates Custom OAuth App Integration. Updates an existing custom OAuth App Integration. You can retrieve the custom - oauth app integration via :method:get.`, + oauth app integration via :method:CustomAppIntegration/get.`, Annotations: map[string]string{}, PreRunE: root.MustAccountClient, diff --git a/cmd/account/encryption-keys/encryption-keys.go b/cmd/account/encryption-keys/encryption-keys.go index 07365bcb..10888bac 100755 --- a/cmd/account/encryption-keys/encryption-keys.go +++ b/cmd/account/encryption-keys/encryption-keys.go @@ -43,6 +43,9 @@ func init() { // TODO: short flags createCmd.Flags().Var(&createJson, "json", `either inline JSON string or @path/to/file.json with request body`) + // TODO: complex arg: aws_key_info + // TODO: complex arg: gcp_key_info + } var createCmd = &cobra.Command{ @@ -61,7 +64,8 @@ var createCmd = &cobra.Command{ EBS volume data. **Important**: Customer-managed keys are supported only for some deployment - types, subscription types, and AWS regions. + types, subscription types, and AWS regions that currently support creation of + Databricks workspaces. This operation is available only if your account is on the E2 version of the platform or on a select custom plan that allows multiple workspaces per @@ -76,13 +80,9 @@ var createCmd = &cobra.Command{ if err != nil { return err } - _, err = fmt.Sscan(args[0], &createReq.AwsKeyInfo) + _, err = fmt.Sscan(args[0], &createReq.UseCases) if err != nil { - return fmt.Errorf("invalid AWS_KEY_INFO: %s", args[0]) - } - _, err = fmt.Sscan(args[1], &createReq.UseCases) - if err != nil { - return fmt.Errorf("invalid USE_CASES: %s", args[1]) + return fmt.Errorf("invalid USE_CASES: %s", args[0]) } response, err := a.EncryptionKeys.Create(ctx, createReq) @@ -112,24 +112,11 @@ var deleteCmd = &cobra.Command{ delete a configuration that is associated with a running workspace.`, Annotations: map[string]string{}, + Args: cobra.ExactArgs(1), PreRunE: root.MustAccountClient, RunE: func(cmd *cobra.Command, args []string) (err error) { ctx := cmd.Context() a := root.AccountClient(ctx) - if len(args) == 0 { - names, err := a.EncryptionKeys.CustomerManagedKeyAwsKeyInfoKeyArnToCustomerManagedKeyIdMap(ctx) - if err != nil { - return err - } - id, err := cmdio.Select(ctx, names, "Databricks encryption key configuration ID") - if err != nil { - return err - } - args = append(args, id) - } - if len(args) != 1 { - return fmt.Errorf("expected to have databricks encryption key configuration id") - } deleteReq.CustomerManagedKeyId = args[0] err = a.EncryptionKeys.Delete(ctx, deleteReq) @@ -169,27 +156,14 @@ var getCmd = &cobra.Command{ types, subscription types, and AWS regions. This operation is available only if your account is on the E2 version of the - platform.`, + platform.",`, Annotations: map[string]string{}, + Args: cobra.ExactArgs(1), PreRunE: root.MustAccountClient, RunE: func(cmd *cobra.Command, args []string) (err error) { ctx := cmd.Context() a := root.AccountClient(ctx) - if len(args) == 0 { - names, err := a.EncryptionKeys.CustomerManagedKeyAwsKeyInfoKeyArnToCustomerManagedKeyIdMap(ctx) - if err != nil { - return err - } - id, err := cmdio.Select(ctx, names, "Databricks encryption key configuration ID") - if err != nil { - return err - } - args = append(args, id) - } - if len(args) != 1 { - return fmt.Errorf("expected to have databricks encryption key configuration id") - } getReq.CustomerManagedKeyId = args[0] response, err := a.EncryptionKeys.Get(ctx, getReq) diff --git a/cmd/account/groups/groups.go b/cmd/account/groups/groups.go index 34bc4da3..fb3da6f7 100755 --- a/cmd/account/groups/groups.go +++ b/cmd/account/groups/groups.go @@ -14,13 +14,13 @@ import ( var Cmd = &cobra.Command{ Use: "groups", - Short: `Groups simplify identity management, making it easier to assign access to Databricks Account, data, and other securable objects.`, + Short: `Groups simplify identity management, making it easier to assign access to Databricks account, data, and other securable objects.`, Long: `Groups simplify identity management, making it easier to assign access to - Databricks Account, data, and other securable objects. + Databricks account, data, and other securable objects. It is best practice to assign access to workspaces and access-control policies in Unity Catalog to groups, instead of to users individually. All Databricks - Account identities can be assigned as members of groups, and members inherit + account identities can be assigned as members of groups, and members inherit permissions that are assigned to their group.`, } @@ -49,7 +49,7 @@ var createCmd = &cobra.Command{ Short: `Create a new group.`, Long: `Create a new group. - Creates a group in the Databricks Account with a unique name, using the + Creates a group in the Databricks account with a unique name, using the supplied group details.`, Annotations: map[string]string{}, @@ -86,7 +86,7 @@ var deleteCmd = &cobra.Command{ Short: `Delete a group.`, Long: `Delete a group. - Deletes a group from the Databricks Account.`, + Deletes a group from the Databricks account.`, Annotations: map[string]string{}, PreRunE: root.MustAccountClient, @@ -98,7 +98,7 @@ var deleteCmd = &cobra.Command{ if err != nil { return err } - id, err := cmdio.Select(ctx, names, "Unique ID for a group in the Databricks Account") + id, err := cmdio.Select(ctx, names, "Unique ID for a group in the Databricks account") if err != nil { return err } @@ -132,7 +132,7 @@ var getCmd = &cobra.Command{ Short: `Get group details.`, Long: `Get group details. - Gets the information for a specific group in the Databricks Account.`, + Gets the information for a specific group in the Databricks account.`, Annotations: map[string]string{}, PreRunE: root.MustAccountClient, @@ -144,7 +144,7 @@ var getCmd = &cobra.Command{ if err != nil { return err } - id, err := cmdio.Select(ctx, names, "Unique ID for a group in the Databricks Account") + id, err := cmdio.Select(ctx, names, "Unique ID for a group in the Databricks account") if err != nil { return err } @@ -186,7 +186,7 @@ var listCmd = &cobra.Command{ Short: `List group details.`, Long: `List group details. - Gets all details of the groups associated with the Databricks Account.`, + Gets all details of the groups associated with the Databricks account.`, Annotations: map[string]string{}, Args: cobra.ExactArgs(0), diff --git a/cmd/account/metastores/metastores.go b/cmd/account/metastores/metastores.go index 68b78616..89fb5ea3 100755 --- a/cmd/account/metastores/metastores.go +++ b/cmd/account/metastores/metastores.go @@ -67,8 +67,7 @@ var deleteCmd = &cobra.Command{ Short: `Delete a metastore.`, Long: `Delete a metastore. - Deletes a Databricks Unity Catalog metastore for an account, both specified by - ID.`, + Deletes a Unity Catalog metastore for an account, both specified by ID.`, Annotations: map[string]string{}, Args: cobra.ExactArgs(1), @@ -101,8 +100,7 @@ var getCmd = &cobra.Command{ Short: `Get a metastore.`, Long: `Get a metastore. - Gets a Databricks Unity Catalog metastore from an account, both specified by - ID.`, + Gets a Unity Catalog metastore from an account, both specified by ID.`, Annotations: map[string]string{}, Args: cobra.ExactArgs(1), diff --git a/cmd/account/o-auth-enrollment/o-auth-enrollment.go b/cmd/account/o-auth-enrollment/o-auth-enrollment.go index bde93681..2003fb89 100755 --- a/cmd/account/o-auth-enrollment/o-auth-enrollment.go +++ b/cmd/account/o-auth-enrollment/o-auth-enrollment.go @@ -44,7 +44,7 @@ var createCmd = &cobra.Command{ The enrollment is executed asynchronously, so the API will return 204 immediately. The actual enrollment take a few minutes, you can check the - status via API :method:get.`, + status via API :method:OAuthEnrollment/get.`, Annotations: map[string]string{}, Args: cobra.ExactArgs(0), diff --git a/cmd/account/published-app-integration/published-app-integration.go b/cmd/account/published-app-integration/published-app-integration.go index 5a87bc7e..9931f3dc 100755 --- a/cmd/account/published-app-integration/published-app-integration.go +++ b/cmd/account/published-app-integration/published-app-integration.go @@ -44,7 +44,8 @@ var createCmd = &cobra.Command{ Create Published OAuth App Integration. - You can retrieve the published oauth app integration via :method:get.`, + You can retrieve the published oauth app integration via + :method:PublishedAppIntegration/get.`, Annotations: map[string]string{}, PreRunE: root.MustAccountClient, @@ -80,7 +81,7 @@ var deleteCmd = &cobra.Command{ Long: `Delete Published OAuth App Integration. Delete an existing Published OAuth App Integration. You can retrieve the - published oauth app integration via :method:get.`, + published oauth app integration via :method:PublishedAppIntegration/get.`, Annotations: map[string]string{}, Args: cobra.ExactArgs(1), @@ -144,7 +145,7 @@ var listCmd = &cobra.Command{ Long: `Get published oauth app integrations. Get the list of published oauth app integrations for the specified Databricks - Account`, + account`, Annotations: map[string]string{}, PreRunE: root.MustAccountClient, @@ -179,7 +180,7 @@ var updateCmd = &cobra.Command{ Long: `Updates Published OAuth App Integration. Updates an existing published OAuth App Integration. You can retrieve the - published oauth app integration via :method:get.`, + published oauth app integration via :method:PublishedAppIntegration/get.`, Annotations: map[string]string{}, PreRunE: root.MustAccountClient, diff --git a/cmd/account/service-principal-secrets/service-principal-secrets.go b/cmd/account/service-principal-secrets/service-principal-secrets.go new file mode 100755 index 00000000..cbc909e6 --- /dev/null +++ b/cmd/account/service-principal-secrets/service-principal-secrets.go @@ -0,0 +1,143 @@ +// Code generated from OpenAPI specs by Databricks SDK Generator. DO NOT EDIT. + +package service_principal_secrets + +import ( + "fmt" + + "github.com/databricks/cli/cmd/root" + "github.com/databricks/cli/libs/cmdio" + "github.com/databricks/databricks-sdk-go/service/oauth2" + "github.com/spf13/cobra" +) + +var Cmd = &cobra.Command{ + Use: "service-principal-secrets", + Short: `These APIs enable administrators to manage service principal secrets.`, + Long: `These APIs enable administrators to manage service principal secrets. + + You can use the generated secrets to obtain OAuth access tokens for a service + principal, which can then be used to access Databricks Accounts and Workspace + APIs. For more information, see [Authentication using OAuth tokens for service + principals], + + In addition, the generated secrets can be used to configure the Databricks + Terraform Provider to authenticate with the service principal. For more + information, see [Databricks Terraform Provider]. + + [Authentication using OAuth tokens for service principals]: https://docs.databricks.com/dev-tools/authentication-oauth.html + [Databricks Terraform Provider]: https://github.com/databricks/terraform-provider-databricks/blob/master/docs/index.md#authenticating-with-service-principal`, +} + +// start create command + +var createReq oauth2.CreateServicePrincipalSecretRequest + +func init() { + Cmd.AddCommand(createCmd) + // TODO: short flags + +} + +var createCmd = &cobra.Command{ + Use: "create SERVICE_PRINCIPAL_ID", + Short: `Create service principal secret.`, + Long: `Create service principal secret. + + Create a secret for the given service principal.`, + + Annotations: map[string]string{}, + Args: cobra.ExactArgs(1), + PreRunE: root.MustAccountClient, + RunE: func(cmd *cobra.Command, args []string) (err error) { + ctx := cmd.Context() + a := root.AccountClient(ctx) + _, err = fmt.Sscan(args[0], &createReq.ServicePrincipalId) + if err != nil { + return fmt.Errorf("invalid SERVICE_PRINCIPAL_ID: %s", args[0]) + } + + response, err := a.ServicePrincipalSecrets.Create(ctx, createReq) + if err != nil { + return err + } + return cmdio.Render(ctx, response) + }, +} + +// start delete command + +var deleteReq oauth2.DeleteServicePrincipalSecretRequest + +func init() { + Cmd.AddCommand(deleteCmd) + // TODO: short flags + +} + +var deleteCmd = &cobra.Command{ + Use: "delete SERVICE_PRINCIPAL_ID SECRET_ID", + Short: `Delete service principal secret.`, + Long: `Delete service principal secret. + + Delete a secret from the given service principal.`, + + Annotations: map[string]string{}, + Args: cobra.ExactArgs(2), + PreRunE: root.MustAccountClient, + RunE: func(cmd *cobra.Command, args []string) (err error) { + ctx := cmd.Context() + a := root.AccountClient(ctx) + _, err = fmt.Sscan(args[0], &deleteReq.ServicePrincipalId) + if err != nil { + return fmt.Errorf("invalid SERVICE_PRINCIPAL_ID: %s", args[0]) + } + deleteReq.SecretId = args[1] + + err = a.ServicePrincipalSecrets.Delete(ctx, deleteReq) + if err != nil { + return err + } + return nil + }, +} + +// start list command + +var listReq oauth2.ListServicePrincipalSecretsRequest + +func init() { + Cmd.AddCommand(listCmd) + // TODO: short flags + +} + +var listCmd = &cobra.Command{ + Use: "list SERVICE_PRINCIPAL_ID", + Short: `List service principal secrets.`, + Long: `List service principal secrets. + + List all secrets associated with the given service principal. This operation + only returns information about the secrets themselves and does not include the + secret values.`, + + Annotations: map[string]string{}, + Args: cobra.ExactArgs(1), + PreRunE: root.MustAccountClient, + RunE: func(cmd *cobra.Command, args []string) (err error) { + ctx := cmd.Context() + a := root.AccountClient(ctx) + _, err = fmt.Sscan(args[0], &listReq.ServicePrincipalId) + if err != nil { + return fmt.Errorf("invalid SERVICE_PRINCIPAL_ID: %s", args[0]) + } + + response, err := a.ServicePrincipalSecrets.ListAll(ctx, listReq) + if err != nil { + return err + } + return cmdio.Render(ctx, response) + }, +} + +// end service ServicePrincipalSecrets diff --git a/cmd/account/service-principals/service-principals.go b/cmd/account/service-principals/service-principals.go index b7e0c307..695d497b 100755 --- a/cmd/account/service-principals/service-principals.go +++ b/cmd/account/service-principals/service-principals.go @@ -49,7 +49,7 @@ var createCmd = &cobra.Command{ Short: `Create a service principal.`, Long: `Create a service principal. - Creates a new service principal in the Databricks Account.`, + Creates a new service principal in the Databricks account.`, Annotations: map[string]string{}, PreRunE: root.MustAccountClient, @@ -85,7 +85,7 @@ var deleteCmd = &cobra.Command{ Short: `Delete a service principal.`, Long: `Delete a service principal. - Delete a single service principal in the Databricks Account.`, + Delete a single service principal in the Databricks account.`, Annotations: map[string]string{}, PreRunE: root.MustAccountClient, @@ -97,7 +97,7 @@ var deleteCmd = &cobra.Command{ if err != nil { return err } - id, err := cmdio.Select(ctx, names, "Unique ID for a service principal in the Databricks Account") + id, err := cmdio.Select(ctx, names, "Unique ID for a service principal in the Databricks account") if err != nil { return err } @@ -132,7 +132,7 @@ var getCmd = &cobra.Command{ Long: `Get service principal details. Gets the details for a single service principal define in the Databricks - Account.`, + account.`, Annotations: map[string]string{}, PreRunE: root.MustAccountClient, @@ -144,7 +144,7 @@ var getCmd = &cobra.Command{ if err != nil { return err } - id, err := cmdio.Select(ctx, names, "Unique ID for a service principal in the Databricks Account") + id, err := cmdio.Select(ctx, names, "Unique ID for a service principal in the Databricks account") if err != nil { return err } @@ -186,7 +186,7 @@ var listCmd = &cobra.Command{ Short: `List service principals.`, Long: `List service principals. - Gets the set of service principals associated with a Databricks Account.`, + Gets the set of service principals associated with a Databricks account.`, Annotations: map[string]string{}, Args: cobra.ExactArgs(0), @@ -223,7 +223,7 @@ var patchCmd = &cobra.Command{ Long: `Update service principal details. Partially updates the details of a single service principal in the Databricks - Account.`, + account.`, Annotations: map[string]string{}, PreRunE: root.MustAccountClient, diff --git a/cmd/account/storage-credentials/storage-credentials.go b/cmd/account/storage-credentials/storage-credentials.go index dcfa9c16..2dc3d497 100755 --- a/cmd/account/storage-credentials/storage-credentials.go +++ b/cmd/account/storage-credentials/storage-credentials.go @@ -68,6 +68,41 @@ var createCmd = &cobra.Command{ }, } +// start delete command + +var deleteReq catalog.DeleteAccountStorageCredentialRequest + +func init() { + Cmd.AddCommand(deleteCmd) + // TODO: short flags + +} + +var deleteCmd = &cobra.Command{ + Use: "delete METASTORE_ID NAME", + Short: `Delete a storage credential.`, + Long: `Delete a storage credential. + + Deletes a storage credential from the metastore. The caller must be an owner + of the storage credential.`, + + Annotations: map[string]string{}, + Args: cobra.ExactArgs(2), + PreRunE: root.MustAccountClient, + RunE: func(cmd *cobra.Command, args []string) (err error) { + ctx := cmd.Context() + a := root.AccountClient(ctx) + deleteReq.MetastoreId = args[0] + deleteReq.Name = args[1] + + err = a.StorageCredentials.Delete(ctx, deleteReq) + if err != nil { + return err + } + return nil + }, +} + // start get command var getReq catalog.GetAccountStorageCredentialRequest @@ -138,4 +173,55 @@ var listCmd = &cobra.Command{ }, } +// start update command + +var updateReq catalog.UpdateStorageCredential +var updateJson flags.JsonFlag + +func init() { + Cmd.AddCommand(updateCmd) + // TODO: short flags + updateCmd.Flags().Var(&updateJson, "json", `either inline JSON string or @path/to/file.json with request body`) + + // TODO: complex arg: aws_iam_role + // TODO: complex arg: azure_service_principal + updateCmd.Flags().StringVar(&updateReq.Comment, "comment", updateReq.Comment, `Comment associated with the credential.`) + updateCmd.Flags().BoolVar(&updateReq.Force, "force", updateReq.Force, `Force update even if there are dependent external locations or external tables.`) + // TODO: complex arg: gcp_service_account_key + updateCmd.Flags().StringVar(&updateReq.Name, "name", updateReq.Name, `The credential name.`) + updateCmd.Flags().StringVar(&updateReq.Owner, "owner", updateReq.Owner, `Username of current owner of credential.`) + updateCmd.Flags().BoolVar(&updateReq.ReadOnly, "read-only", updateReq.ReadOnly, `Whether the storage credential is only usable for read operations.`) + updateCmd.Flags().BoolVar(&updateReq.SkipValidation, "skip-validation", updateReq.SkipValidation, `Supplying true to this argument skips validation of the updated credential.`) + +} + +var updateCmd = &cobra.Command{ + Use: "update", + Short: `Updates a storage credential.`, + Long: `Updates a storage credential. + + Updates a storage credential on the metastore. The caller must be the owner of + the storage credential. If the caller is a metastore admin, only the __owner__ + credential can be changed.`, + + Annotations: map[string]string{}, + PreRunE: root.MustAccountClient, + RunE: func(cmd *cobra.Command, args []string) (err error) { + ctx := cmd.Context() + a := root.AccountClient(ctx) + err = updateJson.Unmarshal(&updateReq) + if err != nil { + return err + } + updateReq.MetastoreId = args[0] + updateReq.Name = args[1] + + response, err := a.StorageCredentials.Update(ctx, updateReq) + if err != nil { + return err + } + return cmdio.Render(ctx, response) + }, +} + // end service AccountStorageCredentials diff --git a/cmd/account/users/users.go b/cmd/account/users/users.go index c4eee002..d4faca20 100755 --- a/cmd/account/users/users.go +++ b/cmd/account/users/users.go @@ -18,13 +18,13 @@ var Cmd = &cobra.Command{ Long: `User identities recognized by Databricks and represented by email addresses. Databricks recommends using SCIM provisioning to sync users and groups - automatically from your identity provider to your Databricks Account. SCIM + automatically from your identity provider to your Databricks account. SCIM streamlines onboarding a new employee or team by using your identity provider - to create users and groups in Databricks Account and give them the proper + to create users and groups in Databricks account and give them the proper level of access. When a user leaves your organization or no longer needs - access to Databricks Account, admins can terminate the user in your identity + access to Databricks account, admins can terminate the user in your identity provider and that user’s account will also be removed from Databricks - Account. This ensures a consistent offboarding process and prevents + account. This ensures a consistent offboarding process and prevents unauthorized users from accessing sensitive data.`, } @@ -56,7 +56,7 @@ var createCmd = &cobra.Command{ Short: `Create a new user.`, Long: `Create a new user. - Creates a new user in the Databricks Account. This new user will also be added + Creates a new user in the Databricks account. This new user will also be added to the Databricks account.`, Annotations: map[string]string{}, @@ -93,7 +93,7 @@ var deleteCmd = &cobra.Command{ Short: `Delete a user.`, Long: `Delete a user. - Deletes a user. Deleting a user from a Databricks Account also removes objects + Deletes a user. Deleting a user from a Databricks account also removes objects associated with the user.`, Annotations: map[string]string{}, @@ -106,7 +106,7 @@ var deleteCmd = &cobra.Command{ if err != nil { return err } - id, err := cmdio.Select(ctx, names, "Unique ID for a user in the Databricks Account") + id, err := cmdio.Select(ctx, names, "Unique ID for a user in the Databricks account") if err != nil { return err } @@ -140,7 +140,7 @@ var getCmd = &cobra.Command{ Short: `Get user details.`, Long: `Get user details. - Gets information for a specific user in Databricks Account.`, + Gets information for a specific user in Databricks account.`, Annotations: map[string]string{}, PreRunE: root.MustAccountClient, @@ -152,7 +152,7 @@ var getCmd = &cobra.Command{ if err != nil { return err } - id, err := cmdio.Select(ctx, names, "Unique ID for a user in the Databricks Account") + id, err := cmdio.Select(ctx, names, "Unique ID for a user in the Databricks account") if err != nil { return err } @@ -194,7 +194,7 @@ var listCmd = &cobra.Command{ Short: `List users.`, Long: `List users. - Gets details for all the users associated with a Databricks Account.`, + Gets details for all the users associated with a Databricks account.`, Annotations: map[string]string{}, Args: cobra.ExactArgs(0), diff --git a/cmd/account/workspace-assignment/workspace-assignment.go b/cmd/account/workspace-assignment/workspace-assignment.go index 8f28401d..f1f10929 100755 --- a/cmd/account/workspace-assignment/workspace-assignment.go +++ b/cmd/account/workspace-assignment/workspace-assignment.go @@ -111,8 +111,8 @@ var listCmd = &cobra.Command{ Short: `Get permission assignments.`, Long: `Get permission assignments. - Get the permission assignments for the specified Databricks Account and - Databricks Workspace.`, + Get the permission assignments for the specified Databricks account and + Databricks workspace.`, Annotations: map[string]string{}, Args: cobra.ExactArgs(1), diff --git a/cmd/workspace/alerts/alerts.go b/cmd/workspace/alerts/alerts.go index 80bed8c8..5c969880 100755 --- a/cmd/workspace/alerts/alerts.go +++ b/cmd/workspace/alerts/alerts.go @@ -18,7 +18,8 @@ var Cmd = &cobra.Command{ Long: `The alerts API can be used to perform CRUD operations on alerts. An alert is a Databricks SQL object that periodically runs a query, evaluates a condition of its result, and notifies one or more users and/or notification destinations if - the condition was met.`, + the condition was met. Alerts can be scheduled using the sql_task type of + the Jobs API, e.g. :method:jobs/create.`, } // start create command diff --git a/cmd/workspace/catalogs/catalogs.go b/cmd/workspace/catalogs/catalogs.go index 7e5b761b..025f318c 100755 --- a/cmd/workspace/catalogs/catalogs.go +++ b/cmd/workspace/catalogs/catalogs.go @@ -181,6 +181,7 @@ func init() { updateCmd.Flags().Var(&updateJson, "json", `either inline JSON string or @path/to/file.json with request body`) updateCmd.Flags().StringVar(&updateReq.Comment, "comment", updateReq.Comment, `User-provided free-form text description.`) + updateCmd.Flags().Var(&updateReq.IsolationMode, "isolation-mode", `Whether the current securable is accessible from all workspaces or a specific set of workspaces.`) updateCmd.Flags().StringVar(&updateReq.Name, "name", updateReq.Name, `Name of catalog.`) updateCmd.Flags().StringVar(&updateReq.Owner, "owner", updateReq.Owner, `Username of current owner of catalog.`) // TODO: map via StringToStringVar: properties diff --git a/cmd/workspace/clusters/clusters.go b/cmd/workspace/clusters/clusters.go index f8c2391a..3a530f8a 100755 --- a/cmd/workspace/clusters/clusters.go +++ b/cmd/workspace/clusters/clusters.go @@ -110,6 +110,7 @@ func init() { createCmd.Flags().BoolVar(&createReq.EnableElasticDisk, "enable-elastic-disk", createReq.EnableElasticDisk, `Autoscaling Local Storage: when enabled, this cluster will dynamically acquire additional disk space when its Spark workers are running low on disk space.`) createCmd.Flags().BoolVar(&createReq.EnableLocalDiskEncryption, "enable-local-disk-encryption", createReq.EnableLocalDiskEncryption, `Whether to enable LUKS on cluster VMs' local disks.`) // TODO: complex arg: gcp_attributes + // TODO: array: init_scripts createCmd.Flags().StringVar(&createReq.InstancePoolId, "instance-pool-id", createReq.InstancePoolId, `The optional ID of the instance pool to which the cluster belongs.`) createCmd.Flags().StringVar(&createReq.NodeTypeId, "node-type-id", createReq.NodeTypeId, `This field encodes, through a single value, the resources available to each of the Spark nodes in this cluster.`) createCmd.Flags().IntVar(&createReq.NumWorkers, "num-workers", createReq.NumWorkers, `Number of worker nodes that this cluster should have.`) @@ -278,6 +279,7 @@ func init() { editCmd.Flags().BoolVar(&editReq.EnableElasticDisk, "enable-elastic-disk", editReq.EnableElasticDisk, `Autoscaling Local Storage: when enabled, this cluster will dynamically acquire additional disk space when its Spark workers are running low on disk space.`) editCmd.Flags().BoolVar(&editReq.EnableLocalDiskEncryption, "enable-local-disk-encryption", editReq.EnableLocalDiskEncryption, `Whether to enable LUKS on cluster VMs' local disks.`) // TODO: complex arg: gcp_attributes + // TODO: array: init_scripts editCmd.Flags().StringVar(&editReq.InstancePoolId, "instance-pool-id", editReq.InstancePoolId, `The optional ID of the instance pool to which the cluster belongs.`) editCmd.Flags().StringVar(&editReq.NodeTypeId, "node-type-id", editReq.NodeTypeId, `This field encodes, through a single value, the resources available to each of the Spark nodes in this cluster.`) editCmd.Flags().IntVar(&editReq.NumWorkers, "num-workers", editReq.NumWorkers, `Number of worker nodes that this cluster should have.`) @@ -413,7 +415,7 @@ var getCmd = &cobra.Command{ Short: `Get cluster info.`, Long: `Get cluster info. - "Retrieves the information for a cluster given its identifier. Clusters can be + Retrieves the information for a cluster given its identifier. Clusters can be described while they are running, or up to 60 days after they are terminated.`, Annotations: map[string]string{}, diff --git a/cmd/workspace/cmd.go b/cmd/workspace/cmd.go index 4c8b348a..19b69035 100755 --- a/cmd/workspace/cmd.go +++ b/cmd/workspace/cmd.go @@ -49,6 +49,7 @@ import ( volumes "github.com/databricks/cli/cmd/workspace/volumes" warehouses "github.com/databricks/cli/cmd/workspace/warehouses" workspace "github.com/databricks/cli/cmd/workspace/workspace" + workspace_bindings "github.com/databricks/cli/cmd/workspace/workspace-bindings" workspace_conf "github.com/databricks/cli/cmd/workspace/workspace-conf" ) @@ -98,5 +99,6 @@ func init() { root.RootCmd.AddCommand(volumes.Cmd) root.RootCmd.AddCommand(warehouses.Cmd) root.RootCmd.AddCommand(workspace.Cmd) + root.RootCmd.AddCommand(workspace_bindings.Cmd) root.RootCmd.AddCommand(workspace_conf.Cmd) } diff --git a/cmd/workspace/dashboards/dashboards.go b/cmd/workspace/dashboards/dashboards.go index 9ce22bf1..c64d3935 100755 --- a/cmd/workspace/dashboards/dashboards.go +++ b/cmd/workspace/dashboards/dashboards.go @@ -19,7 +19,8 @@ var Cmd = &cobra.Command{ it can be useful to use dashboard objects to look-up a collection of related query IDs. The API can also be used to duplicate multiple dashboards at once since you can get a dashboard definition with a GET request and then POST it - to create a new one.`, + to create a new one. Dashboards can be scheduled using the sql_task type of + the Jobs API, e.g. :method:jobs/create.`, } // start create command @@ -32,13 +33,10 @@ func init() { // TODO: short flags createCmd.Flags().Var(&createJson, "json", `either inline JSON string or @path/to/file.json with request body`) - createCmd.Flags().BoolVar(&createReq.DashboardFiltersEnabled, "dashboard-filters-enabled", createReq.DashboardFiltersEnabled, `In the web application, query filters that share a name are coupled to a single selection box if this value is true.`) - createCmd.Flags().BoolVar(&createReq.IsDraft, "is-draft", createReq.IsDraft, `Draft dashboards only appear in list views for their owners.`) - createCmd.Flags().BoolVar(&createReq.IsTrashed, "is-trashed", createReq.IsTrashed, `Indicates whether the dashboard is trashed.`) + createCmd.Flags().BoolVar(&createReq.IsFavorite, "is-favorite", createReq.IsFavorite, `Indicates whether this query object should appear in the current user's favorites list.`) createCmd.Flags().StringVar(&createReq.Name, "name", createReq.Name, `The title of this dashboard that appears in list views and at the top of the dashboard page.`) createCmd.Flags().StringVar(&createReq.Parent, "parent", createReq.Parent, `The identifier of the workspace folder containing the dashboard.`) // TODO: array: tags - // TODO: array: widgets } diff --git a/cmd/workspace/experiments/experiments.go b/cmd/workspace/experiments/experiments.go index 36f04981..8d4e22d7 100755 --- a/cmd/workspace/experiments/experiments.go +++ b/cmd/workspace/experiments/experiments.go @@ -225,7 +225,7 @@ var getByNameCmd = &cobra.Command{ Short: `Get metadata.`, Long: `Get metadata. - "Gets metadata for an experiment. + Gets metadata for an experiment. This endpoint will return deleted experiments, but prefers the active experiment if an active and deleted experiment share the same name. If @@ -233,7 +233,7 @@ var getByNameCmd = &cobra.Command{ them. Throws RESOURCE_DOES_NOT_EXIST if no experiment with the specified name - exists.S`, + exists.`, Annotations: map[string]string{}, Args: cobra.ExactArgs(1), @@ -339,7 +339,7 @@ var getRunCmd = &cobra.Command{ Short: `Get a run.`, Long: `Get a run. - "Gets the metadata, metrics, params, and tags for a run. In the case where + Gets the metadata, metrics, params, and tags for a run. In the case where multiple metrics with the same key are logged for a run, return only the value with the latest timestamp. @@ -514,6 +514,47 @@ var logBatchCmd = &cobra.Command{ }, } +// start log-inputs command + +var logInputsReq ml.LogInputs +var logInputsJson flags.JsonFlag + +func init() { + Cmd.AddCommand(logInputsCmd) + // TODO: short flags + logInputsCmd.Flags().Var(&logInputsJson, "json", `either inline JSON string or @path/to/file.json with request body`) + + // TODO: array: datasets + logInputsCmd.Flags().StringVar(&logInputsReq.RunId, "run-id", logInputsReq.RunId, `ID of the run to log under.`) + +} + +var logInputsCmd = &cobra.Command{ + Use: "log-inputs", + Short: `Log inputs to a run.`, + Long: `Log inputs to a run. + + **NOTE:** Experimental: This API may change or be removed in a future release + without warning.`, + + Annotations: map[string]string{}, + PreRunE: root.MustWorkspaceClient, + RunE: func(cmd *cobra.Command, args []string) (err error) { + ctx := cmd.Context() + w := root.WorkspaceClient(ctx) + err = logInputsJson.Unmarshal(&logInputsReq) + if err != nil { + return err + } + + err = w.Experiments.LogInputs(ctx, logInputsReq) + if err != nil { + return err + } + return nil + }, +} + // start log-metric command var logMetricReq ml.LogMetric @@ -652,12 +693,12 @@ var restoreExperimentCmd = &cobra.Command{ Short: `Restores an experiment.`, Long: `Restores an experiment. - "Restore an experiment marked for deletion. This also restores associated + Restore an experiment marked for deletion. This also restores associated metadata, runs, metrics, params, and tags. If experiment uses FileStore, underlying artifacts associated with experiment are also restored. Throws RESOURCE_DOES_NOT_EXIST if experiment was never created or was - permanently deleted.",`, + permanently deleted.`, Annotations: map[string]string{}, Args: cobra.ExactArgs(1), diff --git a/cmd/workspace/global-init-scripts/global-init-scripts.go b/cmd/workspace/global-init-scripts/global-init-scripts.go index 8eeb866e..d0f562ad 100755 --- a/cmd/workspace/global-init-scripts/global-init-scripts.go +++ b/cmd/workspace/global-init-scripts/global-init-scripts.go @@ -166,7 +166,7 @@ var listCmd = &cobra.Command{ Short: `Get init scripts.`, Long: `Get init scripts. - "Get a list of all global init scripts for this workspace. This returns all + Get a list of all global init scripts for this workspace. This returns all properties for each script but **not** the script contents. To retrieve the contents of a script, use the [get a global init script](#operation/get-script) operation.`, diff --git a/cmd/workspace/groups/groups.go b/cmd/workspace/groups/groups.go index 05f26b64..d05e0863 100755 --- a/cmd/workspace/groups/groups.go +++ b/cmd/workspace/groups/groups.go @@ -14,13 +14,13 @@ import ( var Cmd = &cobra.Command{ Use: "groups", - Short: `Groups simplify identity management, making it easier to assign access to Databricks Workspace, data, and other securable objects.`, + Short: `Groups simplify identity management, making it easier to assign access to Databricks workspace, data, and other securable objects.`, Long: `Groups simplify identity management, making it easier to assign access to - Databricks Workspace, data, and other securable objects. + Databricks workspace, data, and other securable objects. It is best practice to assign access to workspaces and access-control policies in Unity Catalog to groups, instead of to users individually. All Databricks - Workspace identities can be assigned as members of groups, and members inherit + workspace identities can be assigned as members of groups, and members inherit permissions that are assigned to their group.`, } @@ -49,7 +49,7 @@ var createCmd = &cobra.Command{ Short: `Create a new group.`, Long: `Create a new group. - Creates a group in the Databricks Workspace with a unique name, using the + Creates a group in the Databricks workspace with a unique name, using the supplied group details.`, Annotations: map[string]string{}, @@ -86,7 +86,7 @@ var deleteCmd = &cobra.Command{ Short: `Delete a group.`, Long: `Delete a group. - Deletes a group from the Databricks Workspace.`, + Deletes a group from the Databricks workspace.`, Annotations: map[string]string{}, PreRunE: root.MustWorkspaceClient, @@ -98,7 +98,7 @@ var deleteCmd = &cobra.Command{ if err != nil { return err } - id, err := cmdio.Select(ctx, names, "Unique ID for a group in the Databricks Workspace") + id, err := cmdio.Select(ctx, names, "Unique ID for a group in the Databricks workspace") if err != nil { return err } @@ -132,7 +132,7 @@ var getCmd = &cobra.Command{ Short: `Get group details.`, Long: `Get group details. - Gets the information for a specific group in the Databricks Workspace.`, + Gets the information for a specific group in the Databricks workspace.`, Annotations: map[string]string{}, PreRunE: root.MustWorkspaceClient, @@ -144,7 +144,7 @@ var getCmd = &cobra.Command{ if err != nil { return err } - id, err := cmdio.Select(ctx, names, "Unique ID for a group in the Databricks Workspace") + id, err := cmdio.Select(ctx, names, "Unique ID for a group in the Databricks workspace") if err != nil { return err } @@ -186,7 +186,7 @@ var listCmd = &cobra.Command{ Short: `List group details.`, Long: `List group details. - Gets all details of the groups associated with the Databricks Workspace.`, + Gets all details of the groups associated with the Databricks workspace.`, Annotations: map[string]string{}, Args: cobra.ExactArgs(0), diff --git a/cmd/workspace/jobs/jobs.go b/cmd/workspace/jobs/jobs.go index bf97ea77..cbad9731 100755 --- a/cmd/workspace/jobs/jobs.go +++ b/cmd/workspace/jobs/jobs.go @@ -29,10 +29,11 @@ var Cmd = &cobra.Command{ Spark submit, and Java applications. You should never hard code secrets or store them in plain text. Use the - :service:secrets to manage secrets in the [Databricks CLI]. Use the [Secrets + [Secrets CLI] to manage secrets in the [Databricks CLI]. Use the [Secrets utility] to reference secrets in notebooks and jobs. [Databricks CLI]: https://docs.databricks.com/dev-tools/cli/index.html + [Secrets CLI]: https://docs.databricks.com/dev-tools/cli/secrets-cli.html [Secrets utility]: https://docs.databricks.com/dev-tools/databricks-utils.html#dbutils-secrets`, } @@ -184,6 +185,7 @@ func init() { // TODO: array: job_clusters createCmd.Flags().IntVar(&createReq.MaxConcurrentRuns, "max-concurrent-runs", createReq.MaxConcurrentRuns, `An optional maximum allowed number of concurrent runs of the job.`) createCmd.Flags().StringVar(&createReq.Name, "name", createReq.Name, `An optional name for the job.`) + // TODO: complex arg: notification_settings // TODO: complex arg: schedule // TODO: map via StringToStringVar: tags // TODO: array: tasks @@ -852,6 +854,7 @@ func init() { // TODO: array: access_control_list // TODO: complex arg: git_source submitCmd.Flags().StringVar(&submitReq.IdempotencyToken, "idempotency-token", submitReq.IdempotencyToken, `An optional token that can be used to guarantee the idempotency of job run requests.`) + // TODO: complex arg: notification_settings submitCmd.Flags().StringVar(&submitReq.RunName, "run-name", submitReq.RunName, `An optional name for the run.`) // TODO: array: tasks submitCmd.Flags().IntVar(&submitReq.TimeoutSeconds, "timeout-seconds", submitReq.TimeoutSeconds, `An optional timeout applied to each run of this job.`) @@ -928,8 +931,8 @@ func init() { var updateCmd = &cobra.Command{ Use: "update", - Short: `Partially updates a job.`, - Long: `Partially updates a job. + Short: `Partially update a job.`, + Long: `Partially update a job. Add, update, or remove specific settings of an existing job. Use the ResetJob to overwrite all job settings.`, diff --git a/cmd/workspace/model-registry/model-registry.go b/cmd/workspace/model-registry/model-registry.go index f6a29a2a..ea7b9efa 100755 --- a/cmd/workspace/model-registry/model-registry.go +++ b/cmd/workspace/model-registry/model-registry.go @@ -470,7 +470,10 @@ var deleteTransitionRequestCmd = &cobra.Command{ w := root.WorkspaceClient(ctx) deleteTransitionRequestReq.Name = args[0] deleteTransitionRequestReq.Version = args[1] - deleteTransitionRequestReq.Stage = args[2] + _, err = fmt.Sscan(args[2], &deleteTransitionRequestReq.Stage) + if err != nil { + return fmt.Errorf("invalid STAGE: %s", args[2]) + } deleteTransitionRequestReq.Creator = args[3] err = w.ModelRegistry.DeleteTransitionRequest(ctx, deleteTransitionRequestReq) @@ -572,8 +575,8 @@ var getModelCmd = &cobra.Command{ Short: `Get model.`, Long: `Get model. - Get the details of a model. This is a Databricks Workspace version of the - [MLflow endpoint] that also returns the model's Databricks Workspace ID and + Get the details of a model. This is a Databricks workspace version of the + [MLflow endpoint] that also returns the model's Databricks workspace ID and the permission level of the requesting user on the model. [MLflow endpoint]: https://www.mlflow.org/docs/latest/rest-api.html#get-registeredmodel`, @@ -1059,7 +1062,7 @@ var transitionStageCmd = &cobra.Command{ Short: `Transition a stage.`, Long: `Transition a stage. - Transition a model version's stage. This is a Databricks Workspace version of + Transition a model version's stage. This is a Databricks workspace version of the [MLflow endpoint] that also accepts a comment associated with the transition to be recorded.", diff --git a/cmd/workspace/pipelines/pipelines.go b/cmd/workspace/pipelines/pipelines.go index 11bd9c23..94d24eb3 100755 --- a/cmd/workspace/pipelines/pipelines.go +++ b/cmd/workspace/pipelines/pipelines.go @@ -57,6 +57,7 @@ func init() { // TODO: array: libraries createCmd.Flags().StringVar(&createReq.Name, "name", createReq.Name, `Friendly identifier for this pipeline.`) createCmd.Flags().BoolVar(&createReq.Photon, "photon", createReq.Photon, `Whether Photon is enabled for this pipeline.`) + createCmd.Flags().BoolVar(&createReq.Serverless, "serverless", createReq.Serverless, `Whether serverless compute is enabled for this pipeline.`) createCmd.Flags().StringVar(&createReq.Storage, "storage", createReq.Storage, `DBFS root directory for storing checkpoints and tables.`) createCmd.Flags().StringVar(&createReq.Target, "target", createReq.Target, `Target schema (database) to add tables in this pipeline to.`) // TODO: complex arg: trigger @@ -560,6 +561,7 @@ func init() { updateCmd.Flags().StringVar(&updateReq.Name, "name", updateReq.Name, `Friendly identifier for this pipeline.`) updateCmd.Flags().BoolVar(&updateReq.Photon, "photon", updateReq.Photon, `Whether Photon is enabled for this pipeline.`) updateCmd.Flags().StringVar(&updateReq.PipelineId, "pipeline-id", updateReq.PipelineId, `Unique identifier for this pipeline.`) + updateCmd.Flags().BoolVar(&updateReq.Serverless, "serverless", updateReq.Serverless, `Whether serverless compute is enabled for this pipeline.`) updateCmd.Flags().StringVar(&updateReq.Storage, "storage", updateReq.Storage, `DBFS root directory for storing checkpoints and tables.`) updateCmd.Flags().StringVar(&updateReq.Target, "target", updateReq.Target, `Target schema (database) to add tables in this pipeline to.`) // TODO: complex arg: trigger diff --git a/cmd/workspace/queries/queries.go b/cmd/workspace/queries/queries.go index 2a0a94c6..5f4c948f 100755 --- a/cmd/workspace/queries/queries.go +++ b/cmd/workspace/queries/queries.go @@ -17,7 +17,8 @@ var Cmd = &cobra.Command{ Short: `These endpoints are used for CRUD operations on query definitions.`, Long: `These endpoints are used for CRUD operations on query definitions. Query definitions include the target SQL warehouse, query text, name, description, - tags, parameters, and visualizations.`, + tags, parameters, and visualizations. Queries can be scheduled using the + sql_task type of the Jobs API, e.g. :method:jobs/create.`, } // start create command diff --git a/cmd/workspace/recipients/recipients.go b/cmd/workspace/recipients/recipients.go index 4d0b2de9..d90f24a9 100755 --- a/cmd/workspace/recipients/recipients.go +++ b/cmd/workspace/recipients/recipients.go @@ -32,7 +32,7 @@ func init() { // TODO: any: data_recipient_global_metastore_id // TODO: complex arg: ip_access_list createCmd.Flags().StringVar(&createReq.Owner, "owner", createReq.Owner, `Username of the recipient owner.`) - // TODO: any: properties_kvpairs + // TODO: complex arg: properties_kvpairs createCmd.Flags().StringVar(&createReq.SharingCode, "sharing-code", createReq.SharingCode, `The one-time sharing code provided by the data recipient.`) } @@ -300,7 +300,7 @@ func init() { // TODO: complex arg: ip_access_list updateCmd.Flags().StringVar(&updateReq.Name, "name", updateReq.Name, `Name of Recipient.`) updateCmd.Flags().StringVar(&updateReq.Owner, "owner", updateReq.Owner, `Username of the recipient owner.`) - // TODO: any: properties_kvpairs + // TODO: complex arg: properties_kvpairs } diff --git a/cmd/workspace/service-principals/service-principals.go b/cmd/workspace/service-principals/service-principals.go index 9e9f338c..7fb0640e 100755 --- a/cmd/workspace/service-principals/service-principals.go +++ b/cmd/workspace/service-principals/service-principals.go @@ -49,7 +49,7 @@ var createCmd = &cobra.Command{ Short: `Create a service principal.`, Long: `Create a service principal. - Creates a new service principal in the Databricks Workspace.`, + Creates a new service principal in the Databricks workspace.`, Annotations: map[string]string{}, PreRunE: root.MustWorkspaceClient, @@ -85,7 +85,7 @@ var deleteCmd = &cobra.Command{ Short: `Delete a service principal.`, Long: `Delete a service principal. - Delete a single service principal in the Databricks Workspace.`, + Delete a single service principal in the Databricks workspace.`, Annotations: map[string]string{}, PreRunE: root.MustWorkspaceClient, @@ -97,7 +97,7 @@ var deleteCmd = &cobra.Command{ if err != nil { return err } - id, err := cmdio.Select(ctx, names, "Unique ID for a service principal in the Databricks Workspace") + id, err := cmdio.Select(ctx, names, "Unique ID for a service principal in the Databricks workspace") if err != nil { return err } @@ -132,7 +132,7 @@ var getCmd = &cobra.Command{ Long: `Get service principal details. Gets the details for a single service principal define in the Databricks - Workspace.`, + workspace.`, Annotations: map[string]string{}, PreRunE: root.MustWorkspaceClient, @@ -144,7 +144,7 @@ var getCmd = &cobra.Command{ if err != nil { return err } - id, err := cmdio.Select(ctx, names, "Unique ID for a service principal in the Databricks Workspace") + id, err := cmdio.Select(ctx, names, "Unique ID for a service principal in the Databricks workspace") if err != nil { return err } @@ -186,7 +186,7 @@ var listCmd = &cobra.Command{ Short: `List service principals.`, Long: `List service principals. - Gets the set of service principals associated with a Databricks Workspace.`, + Gets the set of service principals associated with a Databricks workspace.`, Annotations: map[string]string{}, Args: cobra.ExactArgs(0), @@ -223,7 +223,7 @@ var patchCmd = &cobra.Command{ Long: `Update service principal details. Partially updates the details of a single service principal in the Databricks - Workspace.`, + workspace.`, Annotations: map[string]string{}, PreRunE: root.MustWorkspaceClient, diff --git a/cmd/workspace/storage-credentials/storage-credentials.go b/cmd/workspace/storage-credentials/storage-credentials.go index ac54f612..512ede41 100755 --- a/cmd/workspace/storage-credentials/storage-credentials.go +++ b/cmd/workspace/storage-credentials/storage-credentials.go @@ -202,7 +202,7 @@ var listCmd = &cobra.Command{ RunE: func(cmd *cobra.Command, args []string) (err error) { ctx := cmd.Context() w := root.WorkspaceClient(ctx) - response, err := w.StorageCredentials.List(ctx) + response, err := w.StorageCredentials.ListAll(ctx) if err != nil { return err } @@ -250,7 +250,8 @@ var updateCmd = &cobra.Command{ if err != nil { return err } - updateReq.Name = args[0] + updateReq.MetastoreId = args[0] + updateReq.Name = args[1] response, err := w.StorageCredentials.Update(ctx, updateReq) if err != nil { diff --git a/cmd/workspace/token-management/token-management.go b/cmd/workspace/token-management/token-management.go index 0f146f74..e9a8db47 100755 --- a/cmd/workspace/token-management/token-management.go +++ b/cmd/workspace/token-management/token-management.go @@ -81,7 +81,7 @@ var deleteCmd = &cobra.Command{ ctx := cmd.Context() w := root.WorkspaceClient(ctx) if len(args) == 0 { - names, err := w.TokenManagement.PublicTokenInfoCommentToTokenIdMap(ctx, settings.ListTokenManagementRequest{}) + names, err := w.TokenManagement.TokenInfoCommentToTokenIdMap(ctx, settings.ListTokenManagementRequest{}) if err != nil { return err } @@ -127,7 +127,7 @@ var getCmd = &cobra.Command{ ctx := cmd.Context() w := root.WorkspaceClient(ctx) if len(args) == 0 { - names, err := w.TokenManagement.PublicTokenInfoCommentToTokenIdMap(ctx, settings.ListTokenManagementRequest{}) + names, err := w.TokenManagement.TokenInfoCommentToTokenIdMap(ctx, settings.ListTokenManagementRequest{}) if err != nil { return err } diff --git a/cmd/workspace/tokens/tokens.go b/cmd/workspace/tokens/tokens.go index e4294b9d..94435d8e 100755 --- a/cmd/workspace/tokens/tokens.go +++ b/cmd/workspace/tokens/tokens.go @@ -82,7 +82,7 @@ var deleteCmd = &cobra.Command{ ctx := cmd.Context() w := root.WorkspaceClient(ctx) if len(args) == 0 { - names, err := w.Tokens.PublicTokenInfoCommentToTokenIdMap(ctx) + names, err := w.Tokens.TokenInfoCommentToTokenIdMap(ctx) if err != nil { return err } diff --git a/cmd/workspace/users/users.go b/cmd/workspace/users/users.go index 925abb25..1c509ef2 100755 --- a/cmd/workspace/users/users.go +++ b/cmd/workspace/users/users.go @@ -18,13 +18,13 @@ var Cmd = &cobra.Command{ Long: `User identities recognized by Databricks and represented by email addresses. Databricks recommends using SCIM provisioning to sync users and groups - automatically from your identity provider to your Databricks Workspace. SCIM + automatically from your identity provider to your Databricks workspace. SCIM streamlines onboarding a new employee or team by using your identity provider - to create users and groups in Databricks Workspace and give them the proper + to create users and groups in Databricks workspace and give them the proper level of access. When a user leaves your organization or no longer needs - access to Databricks Workspace, admins can terminate the user in your identity + access to Databricks workspace, admins can terminate the user in your identity provider and that user’s account will also be removed from Databricks - Workspace. This ensures a consistent offboarding process and prevents + workspace. This ensures a consistent offboarding process and prevents unauthorized users from accessing sensitive data.`, } @@ -56,7 +56,7 @@ var createCmd = &cobra.Command{ Short: `Create a new user.`, Long: `Create a new user. - Creates a new user in the Databricks Workspace. This new user will also be + Creates a new user in the Databricks workspace. This new user will also be added to the Databricks account.`, Annotations: map[string]string{}, @@ -93,7 +93,7 @@ var deleteCmd = &cobra.Command{ Short: `Delete a user.`, Long: `Delete a user. - Deletes a user. Deleting a user from a Databricks Workspace also removes + Deletes a user. Deleting a user from a Databricks workspace also removes objects associated with the user.`, Annotations: map[string]string{}, @@ -106,7 +106,7 @@ var deleteCmd = &cobra.Command{ if err != nil { return err } - id, err := cmdio.Select(ctx, names, "Unique ID for a user in the Databricks Workspace") + id, err := cmdio.Select(ctx, names, "Unique ID for a user in the Databricks workspace") if err != nil { return err } @@ -140,7 +140,7 @@ var getCmd = &cobra.Command{ Short: `Get user details.`, Long: `Get user details. - Gets information for a specific user in Databricks Workspace.`, + Gets information for a specific user in Databricks workspace.`, Annotations: map[string]string{}, PreRunE: root.MustWorkspaceClient, @@ -152,7 +152,7 @@ var getCmd = &cobra.Command{ if err != nil { return err } - id, err := cmdio.Select(ctx, names, "Unique ID for a user in the Databricks Workspace") + id, err := cmdio.Select(ctx, names, "Unique ID for a user in the Databricks workspace") if err != nil { return err } @@ -194,7 +194,7 @@ var listCmd = &cobra.Command{ Short: `List users.`, Long: `List users. - Gets details for all the users associated with a Databricks Workspace.`, + Gets details for all the users associated with a Databricks workspace.`, Annotations: map[string]string{}, Args: cobra.ExactArgs(0), diff --git a/cmd/workspace/warehouses/warehouses.go b/cmd/workspace/warehouses/warehouses.go index e723ce0d..b66445d7 100755 --- a/cmd/workspace/warehouses/warehouses.go +++ b/cmd/workspace/warehouses/warehouses.go @@ -391,7 +391,6 @@ func init() { setWorkspaceWarehouseConfigCmd.Flags().StringVar(&setWorkspaceWarehouseConfigReq.GoogleServiceAccount, "google-service-account", setWorkspaceWarehouseConfigReq.GoogleServiceAccount, `GCP only: Google Service Account used to pass to cluster to access Google Cloud Storage.`) setWorkspaceWarehouseConfigCmd.Flags().StringVar(&setWorkspaceWarehouseConfigReq.InstanceProfileArn, "instance-profile-arn", setWorkspaceWarehouseConfigReq.InstanceProfileArn, `AWS Only: Instance profile used to pass IAM role to the cluster.`) setWorkspaceWarehouseConfigCmd.Flags().Var(&setWorkspaceWarehouseConfigReq.SecurityPolicy, "security-policy", `Security policy for warehouses.`) - setWorkspaceWarehouseConfigCmd.Flags().BoolVar(&setWorkspaceWarehouseConfigReq.ServerlessAgreement, "serverless-agreement", setWorkspaceWarehouseConfigReq.ServerlessAgreement, `Internal.`) // TODO: complex arg: sql_configuration_parameters } diff --git a/cmd/workspace/workspace-bindings/workspace-bindings.go b/cmd/workspace/workspace-bindings/workspace-bindings.go new file mode 100755 index 00000000..2874269d --- /dev/null +++ b/cmd/workspace/workspace-bindings/workspace-bindings.go @@ -0,0 +1,100 @@ +// Code generated from OpenAPI specs by Databricks SDK Generator. DO NOT EDIT. + +package workspace_bindings + +import ( + "github.com/databricks/cli/cmd/root" + "github.com/databricks/cli/libs/cmdio" + "github.com/databricks/cli/libs/flags" + "github.com/databricks/databricks-sdk-go/service/catalog" + "github.com/spf13/cobra" +) + +var Cmd = &cobra.Command{ + Use: "workspace-bindings", + Short: `A catalog in Databricks can be configured as __OPEN__ or __ISOLATED__.`, + Long: `A catalog in Databricks can be configured as __OPEN__ or __ISOLATED__. An + __OPEN__ catalog can be accessed from any workspace, while an __ISOLATED__ + catalog can only be access from a configured list of workspaces. + + A catalog's workspace bindings can be configured by a metastore admin or the + owner of the catalog.`, +} + +// start get command + +var getReq catalog.GetWorkspaceBindingRequest + +func init() { + Cmd.AddCommand(getCmd) + // TODO: short flags + +} + +var getCmd = &cobra.Command{ + Use: "get NAME", + Short: `Get catalog workspace bindings.`, + Long: `Get catalog workspace bindings. + + Gets workspace bindings of the catalog. The caller must be a metastore admin + or an owner of the catalog.`, + + Annotations: map[string]string{}, + Args: cobra.ExactArgs(1), + PreRunE: root.MustWorkspaceClient, + RunE: func(cmd *cobra.Command, args []string) (err error) { + ctx := cmd.Context() + w := root.WorkspaceClient(ctx) + getReq.Name = args[0] + + response, err := w.WorkspaceBindings.Get(ctx, getReq) + if err != nil { + return err + } + return cmdio.Render(ctx, response) + }, +} + +// start update command + +var updateReq catalog.UpdateWorkspaceBindings +var updateJson flags.JsonFlag + +func init() { + Cmd.AddCommand(updateCmd) + // TODO: short flags + updateCmd.Flags().Var(&updateJson, "json", `either inline JSON string or @path/to/file.json with request body`) + + // TODO: array: assign_workspaces + // TODO: array: unassign_workspaces + +} + +var updateCmd = &cobra.Command{ + Use: "update", + Short: `Update catalog workspace bindings.`, + Long: `Update catalog workspace bindings. + + Updates workspace bindings of the catalog. The caller must be a metastore + admin or an owner of the catalog.`, + + Annotations: map[string]string{}, + PreRunE: root.MustWorkspaceClient, + RunE: func(cmd *cobra.Command, args []string) (err error) { + ctx := cmd.Context() + w := root.WorkspaceClient(ctx) + err = updateJson.Unmarshal(&updateReq) + if err != nil { + return err + } + updateReq.Name = args[0] + + response, err := w.WorkspaceBindings.Update(ctx, updateReq) + if err != nil { + return err + } + return cmdio.Render(ctx, response) + }, +} + +// end service WorkspaceBindings diff --git a/go.mod b/go.mod index 87cab539..4ab8f357 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.18 require ( github.com/briandowns/spinner v1.23.0 // Apache 2.0 - github.com/databricks/databricks-sdk-go v0.8.0 // Apache 2.0 + github.com/databricks/databricks-sdk-go v0.9.0 // Apache 2.0 github.com/fatih/color v1.15.0 // MIT github.com/ghodss/yaml v1.0.0 // MIT + NOTICE github.com/google/uuid v1.3.0 // BSD-3-Clause @@ -20,13 +20,13 @@ require ( github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 // MIT github.com/spf13/cobra v1.7.0 // Apache 2.0 github.com/spf13/pflag v1.0.5 // BSD-3-Clause - github.com/stretchr/testify v1.8.2 // MIT + github.com/stretchr/testify v1.8.3 // MIT github.com/whilp/git-urls v1.0.0 // MIT golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0 golang.org/x/mod v0.10.0 - golang.org/x/oauth2 v0.7.0 + golang.org/x/oauth2 v0.8.0 golang.org/x/sync v0.2.0 - golang.org/x/term v0.7.0 + golang.org/x/term v0.8.0 golang.org/x/text v0.9.0 gopkg.in/ini.v1 v1.67.0 // Apache 2.0 ) @@ -40,7 +40,7 @@ require ( github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-querystring v1.1.0 // indirect - github.com/google/s2a-go v0.1.0 // indirect + github.com/google/s2a-go v0.1.3 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -49,12 +49,12 @@ require ( github.com/zclconf/go-cty v1.13.0 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/crypto v0.7.0 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/sys v0.7.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/sys v0.8.0 // indirect golang.org/x/time v0.3.0 // indirect - google.golang.org/api v0.118.0 // indirect + google.golang.org/api v0.123.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd // indirect + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect google.golang.org/grpc v1.54.0 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index ffb1030b..d2cf8977 100644 --- a/go.sum +++ b/go.sum @@ -30,8 +30,8 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/databricks/databricks-sdk-go v0.8.0 h1:LNWpcjDDFB9glT3aj6+Ie8Nlk3346TGCHUyUs3D5sU4= -github.com/databricks/databricks-sdk-go v0.8.0/go.mod h1:aEMLe00mMlf5gvkD8PInqOM+dIAimeuAM6U+9eQN2yE= +github.com/databricks/databricks-sdk-go v0.9.0 h1:wFeb4fk2EJ4I/pYpq/KK/O4TwqsDpNBJYauXcISMbRw= +github.com/databricks/databricks-sdk-go v0.9.0/go.mod h1:C0vVp7XV/Q8wf/LJCO1oADE8KLB0kcdukjwZMlwysA0= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -81,8 +81,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/s2a-go v0.1.0 h1:3Qm0liEiCErViKERO2Su5wp+9PfMRiuS6XB5FvpKnYQ= -github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= +github.com/google/s2a-go v0.1.3 h1:FAgZmpLl/SXurPEZyCMPBIiiYeTbqfjlbdnCNTAkbGE= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -143,11 +143,12 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/whilp/git-urls v1.0.0 h1:95f6UMWN5FKW71ECsXRUd3FVYiXdrE7aX4NZKcPmIjU= github.com/whilp/git-urls v1.0.0/go.mod h1:J16SAmobsqc3Qcy98brfl5f5+e0clUvg1krgwk/qCfE= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zclconf/go-cty v1.13.0 h1:It5dfKTTZHe9aeppbNOda3mN7Ag7sg6QkBNm6TkyFa0= github.com/zclconf/go-cty v1.13.0/go.mod h1:YKQzy/7pZ7iq2jNFzy5go57xdxdWoLLpaEp4u238AE0= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= @@ -156,6 +157,7 @@ go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqe golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -164,6 +166,7 @@ golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0/go.mod h1:CxIveKay+FTh1D0yPZ golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -173,21 +176,23 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -202,19 +207,22 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= @@ -224,10 +232,13 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.118.0 h1:FNfHq9Z2GKULxu7cEhCaB0wWQHg43UpomrrN+24ZRdE= -google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= +google.golang.org/api v0.123.0 h1:yHVU//vA+qkOhm4reEC9LtzHVUCN/IqqNRl1iQ9xE20= +google.golang.org/api v0.123.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= @@ -236,8 +247,8 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd h1:sLpv7bNL1AsX3fdnWh9WVh7ejIzXdOc1RRHGeAmeStU= -google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=