Skip to content

Commit 823e008

Browse files
radeksimkoSarahFrench
authored andcommitted
command: Prompt user for default workspace creation
1 parent 5ff7a3a commit 823e008

File tree

1 file changed

+45
-20
lines changed

1 file changed

+45
-20
lines changed

internal/command/meta_backend.go

Lines changed: 45 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1640,32 +1640,57 @@ func (m *Meta) stateStore_C_s(c *configs.StateStore, cHash int, sMgr *clistate.L
16401640
}
16411641

16421642
// Verify that selected workspace exists in the state store.
1643-
// TODO (SarahFrench/radeksimko) - TF core should be responsible for creating the new workspace.
1644-
// > Is this the correct place to do so?
1645-
// > Should we prompt the user to approve creating a new workspace?
16461643
if opts.Init && b != nil {
16471644
err := m.selectWorkspace(b)
16481645
if strings.Contains(err.Error(), "No existing workspaces") {
1649-
// Make the default workspace. All other workspaces are user-created via the workspace commands.
1650-
bStateMgr, sDiags := b.StateMgr(backend.DefaultStateName)
1651-
diags = diags.Append(sDiags)
1652-
if sDiags.HasErrors() {
1653-
diags = diags.Append(fmt.Errorf("Failed to create a state manager for state store %q in provider %s (%q). This is a bug and should be reported: %w",
1654-
c.Type,
1655-
c.Provider.Name,
1656-
c.ProviderAddr,
1657-
sDiags.Err()))
1658-
return nil, diags
1659-
}
1660-
emptyState := states.NewState()
1661-
if err := bStateMgr.WriteState(emptyState); err != nil {
1662-
diags = diags.Append(fmt.Errorf(errStateStoreWorkspaceCreate, c.Type, err))
1646+
ws, err := m.Workspace()
1647+
if err != nil {
1648+
diags = diags.Append(fmt.Errorf("Failed to check current workspace: %w", err))
16631649
return nil, diags
16641650
}
1665-
if err := sMgr.PersistState(); err != nil {
1666-
diags = diags.Append(fmt.Errorf(errStateStoreWorkspaceCreate, c.Type, err))
1667-
return nil, diags
1651+
1652+
if m.Input() && ws == backend.DefaultStateName {
1653+
input := m.UIInput()
1654+
desc := fmt.Sprintf("Terraform will create the %q workspace via %q.\n"+
1655+
"Only 'yes' will be accepted to approve.", backend.DefaultStateName, c.Type)
1656+
v, err := input.Input(context.Background(), &terraform.InputOpts{
1657+
Id: "approve",
1658+
Query: fmt.Sprintf("Workspace %q does not exit, would you like to create one?", backend.DefaultStateName),
1659+
Description: desc,
1660+
})
1661+
if err != nil {
1662+
diags = diags.Append(fmt.Errorf("Failed to confirm default workspace creation: %w", err))
1663+
return nil, diags
1664+
}
1665+
if v != "yes" {
1666+
diags = diags.Append(errors.New("Failed to create default workspace"))
1667+
return nil, diags
1668+
}
1669+
1670+
// TODO: Confirm if defaulting to creation on first use (rather than error) is a good idea
1671+
// Make the default workspace. All other workspaces are user-created via the workspace commands.
1672+
bStateMgr, sDiags := b.StateMgr(backend.DefaultStateName)
1673+
diags = diags.Append(sDiags)
1674+
if sDiags.HasErrors() {
1675+
diags = diags.Append(fmt.Errorf("Failed to create a state manager for state store %q in provider %s (%q). This is a bug in Terraform and should be reported: %w",
1676+
c.Type,
1677+
c.Provider.Name,
1678+
c.ProviderAddr,
1679+
sDiags.Err()))
1680+
return nil, diags
1681+
}
1682+
emptyState := states.NewState()
1683+
if err := bStateMgr.WriteState(emptyState); err != nil {
1684+
diags = diags.Append(fmt.Errorf(errStateStoreWorkspaceCreate, c.Type, err))
1685+
return nil, diags
1686+
}
1687+
if err := sMgr.PersistState(); err != nil {
1688+
diags = diags.Append(fmt.Errorf(errStateStoreWorkspaceCreate, c.Type, err))
1689+
return nil, diags
1690+
}
16681691
}
1692+
// TODO: handle if input is not enabled
1693+
// TODO: handle if non-default workspace is not used
16691694
} else if err != nil {
16701695
diags = diags.Append(err)
16711696
}

0 commit comments

Comments
 (0)