-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathcmd.go
More file actions
102 lines (87 loc) · 3.61 KB
/
cmd.go
File metadata and controls
102 lines (87 loc) · 3.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package pull
import (
"github.com/spf13/cobra"
"github.com/keboola/keboola-as-code/internal/pkg/project"
"github.com/keboola/keboola-as-code/internal/pkg/service/cli/dependencies"
"github.com/keboola/keboola-as-code/internal/pkg/service/cli/helpmsg"
"github.com/keboola/keboola-as-code/internal/pkg/service/common/configmap"
"github.com/keboola/keboola-as-code/internal/pkg/utils/errors"
"github.com/keboola/keboola-as-code/pkg/lib/operation/project/sync/pull"
loadState "github.com/keboola/keboola-as-code/pkg/lib/operation/state/load"
)
type Flags struct {
StorageAPIHost configmap.Value[string] `configKey:"storage-api-host" configShorthand:"H" configUsage:"storage API host, eg. \"connection.keboola.com\""`
StorageAPIToken configmap.Value[string] `configKey:"storage-api-token" configShorthand:"t" configUsage:"storage API token from your project"`
Force configmap.Value[bool] `configKey:"force" configUsage:"ignore invalid local state"`
DryRun configmap.Value[bool] `configKey:"dry-run" configUsage:"print what needs to be done"`
CleanupRenameConflicts configmap.Value[bool] `configKey:"cleanup-rename-conflicts" configUsage:"enable cleanup mode for rename conflicts (removes conflicting destinations)"`
VaultEnabled configmap.Value[bool] `configKey:"vault-enabled" configUsage:"fetch and update vault variables in manifest"`
}
func DefaultFlags() Flags {
return Flags{}
}
func Command(p dependencies.Provider) *cobra.Command {
cmd := &cobra.Command{
Use: "pull",
Short: helpmsg.Read(`sync/pull/short`),
Long: helpmsg.Read(`sync/pull/long`),
RunE: func(cmd *cobra.Command, args []string) (cmdErr error) {
// Command must be used in project directory
_, _, err := p.BaseScope().FsInfo().ProjectDir(cmd.Context())
if err != nil {
return err
}
f := Flags{}
if err = p.BaseScope().ConfigBinder().Bind(cmd.Context(), cmd.Flags(), args, &f); err != nil {
return err
}
// Authentication
d, err := p.RemoteCommandScope(cmd.Context(), f.StorageAPIHost, f.StorageAPIToken)
if err != nil {
return err
}
// Get local project
logger := d.Logger()
force := f.Force.Value
prj, _, err := d.LocalProject(cmd.Context(), force)
if err != nil {
if !force && errors.As(err, &project.InvalidManifestError{}) {
logger.Info(cmd.Context(), "")
logger.Info(cmd.Context(), "Use --force to override the invalid local state.")
}
return err
}
// Load project state
projectState, err := prj.LoadState(cmd.Context(), loadState.PullOptions(force), d)
if err != nil {
if !force && errors.As(err, &loadState.InvalidLocalStateError{}) {
logger.Info(cmd.Context(), "")
logger.Info(cmd.Context(), "Use --force to override the invalid local state.")
}
return err
}
if f.VaultEnabled.Value {
logger.Info(cmd.Context(), "Fetching vault variables...")
variables, err := d.KeboolaProjectAPI().ListVariablesRequest(nil).Send(cmd.Context())
if err != nil {
return err
}
prj.ProjectManifest().SetVaultVariables(*variables)
logger.Infof(cmd.Context(), "Fetched %d vault variables", len(*variables))
}
// Options
options := pull.Options{
DryRun: f.DryRun.Value,
LogUntrackedPaths: true,
CleanupRenameConflicts: f.CleanupRenameConflicts.Value,
}
// Send cmd successful/failed event
defer d.EventSender().SendCmdEvent(cmd.Context(), d.Clock().Now(), &cmdErr, "sync-pull")
// Pull
return pull.Run(cmd.Context(), projectState, options, d)
},
}
// Flags
configmap.MustGenerateFlags(cmd.Flags(), DefaultFlags())
return cmd
}