Files
go-sip/cmd/saas-server/identity.go
T

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()
}