internal/testrunner/runners/system/state.go (74 lines of code) (raw):
// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
// or more contributor license agreements. Licensed under the Elastic License;
// you may not use this file except in compliance with the Elastic License.
package system
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"github.com/elastic/elastic-package/internal/agentdeployer"
"github.com/elastic/elastic-package/internal/kibana"
"github.com/elastic/elastic-package/internal/logger"
"github.com/elastic/elastic-package/internal/servicedeployer"
"github.com/elastic/elastic-package/internal/stack"
)
const (
serviceStateFileName = "service.json"
stateFolderName = "state"
)
type ServiceState struct {
OrigPolicy kibana.Policy `json:"orig_policy"`
EnrollPolicy kibana.Policy `json:"enroll_policy"`
CurrentPolicy kibana.Policy `json:"current_policy"`
Agent kibana.Agent `json:"agent"`
ConfigFilePath string `json:"config_file_path"`
VariantName string `json:"variant_name"`
ServiceRunID string `json:"service_info_run_id"`
AgentRunID string `json:"agent_info_run_id"`
ServiceOutputDir string `json:"service_output_dir"`
}
// stateFolderPath returns the folder where the state data is stored
func stateFolderPath(profilePath string) string {
return filepath.Join(profilePath, stack.ProfileStackPath, stateFolderName)
}
func readServiceStateData(path string) (ServiceState, error) {
var setupData ServiceState
logger.Debugf("Reading test config from file %s", path)
contents, err := os.ReadFile(path)
if err != nil {
return setupData, fmt.Errorf("failed to read test config %q: %w", path, err)
}
err = json.Unmarshal(contents, &setupData)
if err != nil {
return setupData, fmt.Errorf("failed to decode service options %q: %w", path, err)
}
return setupData, nil
}
type scenarioStateOpts struct {
currentPolicy *kibana.Policy
enrollPolicy *kibana.Policy
origPolicy *kibana.Policy
config *testConfig
agent kibana.Agent
agentInfo agentdeployer.AgentInfo
svcInfo servicedeployer.ServiceInfo
}
func writeScenarioState(opts scenarioStateOpts, target string) error {
data := ServiceState{
OrigPolicy: *opts.origPolicy,
EnrollPolicy: *opts.enrollPolicy,
CurrentPolicy: *opts.currentPolicy,
Agent: opts.agent,
ConfigFilePath: opts.config.Path,
VariantName: opts.config.ServiceVariantName,
ServiceRunID: opts.svcInfo.Test.RunID,
AgentRunID: opts.agentInfo.Test.RunID,
ServiceOutputDir: opts.svcInfo.OutputDir,
}
dataBytes, err := json.Marshal(data)
if err != nil {
return fmt.Errorf("failed to marshall service setup data: %w", err)
}
err = os.WriteFile(target, dataBytes, 0644)
if err != nil {
return fmt.Errorf("failed to write service setup JSON: %w", err)
}
return nil
}