Skip to content

Commit caff1e4

Browse files
committed
Merge branch 'feature/transfercampaign'
2 parents 6af343e + 2732560 commit caff1e4

File tree

4 files changed

+344
-233
lines changed

4 files changed

+344
-233
lines changed

cmd/cmd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ var (
1919
clientKeyFile string
2020
caCertFiles []string
2121
tlsParams *util.CustomTlsParams
22+
sourceCampaignName string
2223
)
2324

2425
// RootCmd is the root command for the CLI

cmd/restorer.go

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -111,18 +111,30 @@ var restoreCmd = &cobra.Command{
111111
slog.InfoContext(ctx, "validated credentials and fetched vectr version", "hostname", hostname, "vectr-version", vectrVersion)
112112
versionContext := context.WithValue(ctx, vat.VECTR_VERSION, vat.VatContextValue(vectrVersion))
113113

114-
optionalParams := &vat.RestoreOptionalParams{
115-
AssessmentName: targetAssessmentName,
116-
OverrideAssessmentTemplate: overrideAssessmentTemplate,
117-
}
114+
if sourceCampaignName == "" {
115+
optionalParams := &vat.RestoreOptionalParams{
116+
AssessmentName: targetAssessmentName,
117+
OverrideAssessmentTemplate: overrideAssessmentTemplate,
118+
}
118119

119-
// Restore the assessment
120-
if err := vat.RestoreAssessment(versionContext, client, db, &assessmentData, optionalParams); err != nil {
121-
slog.ErrorContext(versionContext, "Failed to restore assessment", "error", err)
122-
os.Exit(1)
120+
// Restore the assessment
121+
if err := vat.RestoreAssessment(versionContext, client, db, &assessmentData, optionalParams); err != nil {
122+
slog.ErrorContext(versionContext, "Failed to restore assessment", "error", err)
123+
os.Exit(1)
124+
}
125+
slog.InfoContext(ctx, "Assessment restored successfully")
126+
} else {
127+
if targetAssessmentName == "" {
128+
slog.ErrorContext(ctx, "--target-assessment-name is required when using --source-campaign-name")
129+
os.Exit(1)
130+
}
131+
slog.InfoContext(ctx, "Restoring campaign", "source-campaign", sourceCampaignName, "target-assessment", targetAssessmentName)
132+
if err := vat.RestoreCampaign(versionContext, client, db, &assessmentData, sourceCampaignName, targetAssessmentName); err != nil {
133+
slog.ErrorContext(versionContext, "Failed to restore campaign", "error", err)
134+
os.Exit(1)
135+
}
136+
slog.InfoContext(ctx, "Campaign restored successfully")
123137
}
124-
125-
slog.InfoContext(ctx, "Assessment restored successfully")
126138
},
127139
}
128140

@@ -134,8 +146,9 @@ func init() {
134146
restoreCmd.Flags().StringVar(&credentialsFile, "vectr-creds-file", "", "Path to the credentials file (required)")
135147
restoreCmd.Flags().StringVar(&inputFile, "input-file", "", "Path to the encrypted input file (required)")
136148
restoreCmd.Flags().StringVar(&passphraseFile, "passphrase-file", "", "Path to the file containing the decryption passphrase")
137-
restoreCmd.Flags().StringVar(&targetAssessmentName, "target-assessment-name", "", "The assessment name to set in the new instance")
149+
restoreCmd.Flags().StringVar(&targetAssessmentName, "target-assessment-name", "", "The assessment name to set in the new instance. Required when using --source-campaign-name.")
138150
restoreCmd.Flags().BoolVar(&overrideAssessmentTemplate, "override-template-assessment", false, "Override any set template name in the serialized data and load template test cases anyway")
151+
restoreCmd.Flags().StringVar(&sourceCampaignName, "source-campaign-name", "", "Name of a specific campaign to restore from the input file. If set, --target-assessment-name must be an existing assessment.")
139152

140153
// Mark flags as required
141154
restoreCmd.MarkFlagsOneRequired("db", "env")

cmd/transfer.go

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,28 @@ var transferCmd = &cobra.Command{
100100
os.Exit(1)
101101
}
102102

103-
optionalParams := &vat.RestoreOptionalParams{
104-
AssessmentName: targetAssessmentName,
105-
OverrideAssessmentTemplate: overrideAssessmentTemplate,
106-
}
107-
// Transfer the assessment data to the target instance
108-
slog.InfoContext(targetVersionContext, "Transferring assessment data to target instance", "hostname", targetHostname, "db", targetDB)
109-
if err := vat.RestoreAssessment(targetVersionContext, targetClient, targetDB, assessmentData, optionalParams); err != nil {
110-
slog.ErrorContext(targetVersionContext, "Failed to transfer assessment data to target instance", "error", err)
111-
os.Exit(1)
103+
if sourceCampaignName == "" {
104+
optionalParams := &vat.RestoreOptionalParams{
105+
AssessmentName: targetAssessmentName,
106+
OverrideAssessmentTemplate: overrideAssessmentTemplate,
107+
}
108+
// Original full assessment transfer logic
109+
slog.InfoContext(targetVersionContext, "Transferring assessment data to target instance", "hostname", targetHostname, "db", targetDB)
110+
if err := vat.RestoreAssessment(targetVersionContext, targetClient, targetDB, assessmentData, optionalParams); err != nil {
111+
slog.ErrorContext(targetVersionContext, "Failed to transfer assessment data to target instance", "error", err)
112+
os.Exit(1)
113+
}
114+
} else {
115+
// New campaign-only transfer logic
116+
if targetAssessmentName == "" {
117+
slog.ErrorContext(ctx, "--target-assessment-name is required when using --source-campaign-name")
118+
os.Exit(1)
119+
}
120+
slog.InfoContext(targetVersionContext, "Transferring campaign to target assessment", "source-campaign", sourceCampaignName, "target-assessment", targetAssessmentName)
121+
if err := vat.RestoreCampaign(targetVersionContext, targetClient, targetDB, assessmentData, sourceCampaignName, targetAssessmentName); err != nil {
122+
slog.ErrorContext(targetVersionContext, "Failed to transfer campaign to target instance", "error", err)
123+
os.Exit(1)
124+
}
112125
}
113126

114127
slog.InfoContext(ctx, "Assessment transferred successfully")
@@ -128,6 +141,7 @@ func init() {
128141
transferCmd.Flags().StringVar(&assessmentName, "assessment-name", "", "Name of the assessment to transfer (required)")
129142
transferCmd.Flags().StringVar(&targetAssessmentName, "target-assessment-name", "", "The assessment name to set in the new instance")
130143
transferCmd.Flags().BoolVar(&overrideAssessmentTemplate, "override-template-assessment", false, "Ignore the template name in the serialized data and load template test cases anyway")
144+
transferCmd.Flags().StringVar(&sourceCampaignName, "source-campaign-name", "", "Name of a specific campaign to transfer. If set, --target-assessment-name must be an existing assessment.")
131145

132146
// Mark flags as required
133147
transferCmd.MarkFlagRequired("source-hostname")

0 commit comments

Comments
 (0)