@@ -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