49 lines
1.5 KiB
Go
49 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"math"
|
|
)
|
|
|
|
// The namespace is the user-approved test convention, not a business rule in Dispatcher/Agent.
|
|
func testSnapshots(source snapshots) (snapshots, error) {
|
|
if source.tenantID <= 0 || source.tenantID > math.MaxInt64-90000 {
|
|
return snapshots{}, errors.New("source tenant ID cannot be offset safely")
|
|
}
|
|
result := snapshots{dispatcherID: source.dispatcherID, tenantID: 90000 + source.tenantID, sip: source.sip, providers: source.providers, tasks: make(map[string][]byte, len(source.tasks))}
|
|
rewrite := func(raw []byte, resource, taskID string) ([]byte, error) {
|
|
var fields map[string]json.RawMessage
|
|
if err := json.Unmarshal(raw, &fields); err != nil {
|
|
return nil, errors.New("invalid source snapshot")
|
|
}
|
|
fields["tenant_id"], _ = json.Marshal(result.tenantID)
|
|
if taskID != "" {
|
|
fields["task_id"], _ = json.Marshal(taskID)
|
|
}
|
|
output, err := json.Marshal(fields)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err = validateResource(output, resource, source.dispatcherID); err != nil {
|
|
return nil, err
|
|
}
|
|
return output, nil
|
|
}
|
|
var err error
|
|
if result.quota, err = rewrite(source.quota, "tenant_quota", ""); err != nil {
|
|
return result, err
|
|
}
|
|
for id, raw := range source.tasks {
|
|
newID := "test-" + id
|
|
if _, exists := source.tasks[newID]; exists {
|
|
return snapshots{}, fmt.Errorf("test task ID %s conflicts with source", newID)
|
|
}
|
|
if result.tasks[newID], err = rewrite(raw, "task_config", newID); err != nil {
|
|
return result, err
|
|
}
|
|
}
|
|
return result, result.validateReferences()
|
|
}
|