mirror of
https://github.com/hashicorp/terraform.git
synced 2026-03-21 18:10:30 -04:00
111 lines
2.7 KiB
Go
111 lines
2.7 KiB
Go
// Copyright IBM Corp. 2014, 2026
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package command
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/hashicorp/terraform/internal/backend/backendrun"
|
|
"github.com/hashicorp/terraform/internal/command/arguments"
|
|
"github.com/hashicorp/terraform/internal/command/jsonprovider"
|
|
)
|
|
|
|
// ProvidersCommand is a Command implementation that prints out information
|
|
// about the providers used in the current configuration/state.
|
|
type ProvidersSchemaCommand struct {
|
|
Meta
|
|
}
|
|
|
|
func (c *ProvidersSchemaCommand) Help() string {
|
|
return providersSchemaCommandHelp
|
|
}
|
|
|
|
func (c *ProvidersSchemaCommand) Synopsis() string {
|
|
return "Show schemas for the providers used in the configuration"
|
|
}
|
|
|
|
func (c *ProvidersSchemaCommand) Run(args []string) int {
|
|
_, diags := arguments.ParseProvidersSchema(c.Meta.process(args))
|
|
if diags.HasErrors() {
|
|
c.showDiagnostics(diags)
|
|
return 1
|
|
}
|
|
|
|
viewType := arguments.ViewJSON // See above; enforced use of JSON output
|
|
|
|
// Check for user-supplied plugin path
|
|
var err error
|
|
if c.pluginPath, err = c.loadPluginPath(); err != nil {
|
|
c.Ui.Error(fmt.Sprintf("Error loading plugin path: %s", err))
|
|
return 1
|
|
}
|
|
// Load the backend
|
|
b, backendDiags := c.backend(".", viewType)
|
|
diags = diags.Append(backendDiags)
|
|
if backendDiags.HasErrors() {
|
|
c.showDiagnostics(diags)
|
|
return 1
|
|
}
|
|
|
|
// We require a local backend
|
|
local, ok := b.(backendrun.Local)
|
|
if !ok {
|
|
c.showDiagnostics(diags) // in case of any warnings in here
|
|
c.Ui.Error(ErrUnsupportedLocalOp)
|
|
return 1
|
|
}
|
|
|
|
// This is a read-only command
|
|
c.ignoreRemoteVersionConflict(b)
|
|
|
|
// we expect that the config dir is the cwd
|
|
cwd, err := os.Getwd()
|
|
if err != nil {
|
|
c.Ui.Error(fmt.Sprintf("Error getting cwd: %s", err))
|
|
return 1
|
|
}
|
|
|
|
// Build the operation
|
|
opReq := c.Operation(b, arguments.ViewJSON)
|
|
opReq.ConfigDir = cwd
|
|
opReq.ConfigLoader, err = c.initConfigLoader()
|
|
opReq.AllowUnsetVariables = true
|
|
if err != nil {
|
|
diags = diags.Append(err)
|
|
c.showDiagnostics(diags)
|
|
return 1
|
|
}
|
|
|
|
// Get the context
|
|
lr, _, ctxDiags := local.LocalRun(opReq)
|
|
diags = diags.Append(ctxDiags)
|
|
if ctxDiags.HasErrors() {
|
|
c.showDiagnostics(diags)
|
|
return 1
|
|
}
|
|
|
|
schemas, moreDiags := lr.Core.Schemas(lr.Config, lr.InputState)
|
|
diags = diags.Append(moreDiags)
|
|
if moreDiags.HasErrors() {
|
|
c.showDiagnostics(diags)
|
|
return 1
|
|
}
|
|
|
|
jsonSchemas, err := jsonprovider.Marshal(schemas)
|
|
if err != nil {
|
|
c.Ui.Error(fmt.Sprintf("Failed to marshal provider schemas to json: %s", err))
|
|
return 1
|
|
}
|
|
c.Ui.Output(string(jsonSchemas))
|
|
|
|
return 0
|
|
}
|
|
|
|
const providersSchemaCommandHelp = `
|
|
Usage: terraform [global options] providers schema -json
|
|
|
|
Prints out a json representation of the schemas for all providers used
|
|
in the current configuration.
|
|
`
|