Skip to content
This repository has been archived by the owner on Dec 5, 2024. It is now read-only.

Commit

Permalink
Rebasing and adapting features
Browse files Browse the repository at this point in the history
  • Loading branch information
pcantera committed Nov 15, 2022
1 parent b27433b commit 47587ea
Show file tree
Hide file tree
Showing 15 changed files with 447 additions and 103 deletions.
9 changes: 4 additions & 5 deletions api/api_http_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"fmt"
"github.com/ingrammicro/cio/configuration"
"io"
"io/ioutil"
"net/http"
"os"
"regexp"
Expand Down Expand Up @@ -53,7 +52,7 @@ func NewHTTPClient(config *configuration.Config) (svc *HTTPClient, err error) {
}

// Loads CA Certificate
caCert, err := ioutil.ReadFile(svc.config.Certificate.Ca)
caCert, err := os.ReadFile(svc.config.Certificate.Ca)
if err != nil {
return nil, fmt.Errorf("cannot read IMCO CA cert: %v", err)
}
Expand Down Expand Up @@ -154,7 +153,7 @@ func (imco *HTTPClient) DownloadFile(ctx context.Context, url string, filepath s
return "", httpResponse.StatusCode, fmt.Errorf("HTTP request failed with status %s", httpResponse.Status)
}

buf, err := ioutil.ReadAll(httpResponse.Body)
buf, err := io.ReadAll(httpResponse.Body)
if err != nil {
return "", httpResponse.StatusCode, errors.Wrap(err, CannotReadHttpResponseBody)
}
Expand Down Expand Up @@ -205,7 +204,7 @@ func (imco *HTTPClient) UploadFile(ctx context.Context, sourceFilePath, targetUR
return errors.Wrap(err, "Cannot upload file")
}
defer httpResponse.Body.Close()
buf, err := ioutil.ReadAll(httpResponse.Body)
buf, err := io.ReadAll(httpResponse.Body)
if err != nil {
return errors.Wrap(err, CannotReadHttpResponseBody)
}
Expand Down Expand Up @@ -270,7 +269,7 @@ func (imco *HTTPClient) request(ctx context.Context, method string, path string,
}
defer httpResponse.Body.Close()

buf, err := ioutil.ReadAll(httpResponse.Body)
buf, err := io.ReadAll(httpResponse.Body)
if err != nil {
return nil, httpResponse.StatusCode, errors.Wrap(err, CannotReadHttpResponseBody)
}
Expand Down
18 changes: 8 additions & 10 deletions cmd/agent/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,17 @@ package agent

import (
"fmt"
"io/ioutil"
"github.com/ingrammicro/cio/logger"
"os"
"path/filepath"
"runtime"

"github.com/ingrammicro/cio/api"
"github.com/ingrammicro/cio/cmd"
"github.com/ingrammicro/cio/utils/format"
log "github.com/sirupsen/logrus"

"github.com/ingrammicro/cio/configuration"
"github.com/ingrammicro/cio/utils/format"

"text/template"

//_ "github.com/ingrammicro/cio/cmd/agent/bootstrapping"
//_ "github.com/ingrammicro/cio/cmd/agent/brownfield"
//_ "github.com/ingrammicro/cio/cmd/agent/converge"
Expand Down Expand Up @@ -45,7 +42,8 @@ func RegisterPolling() {

// Register registers the brownfield/polling process
func Register(context configuration.Context) {
log.Info("Register")
logger.DebugFuncInfo()

f := format.GetFormatter()
config, err := configuration.GetConfig()
if err != nil {
Expand Down Expand Up @@ -162,23 +160,23 @@ func configureServerKeys(config *configuration.Config, rootCACert, cert, key str
if err != nil {
return fmt.Errorf("cannot create directory to place root CA cert: %v", err)
}
err = ioutil.WriteFile(configFileData.CaCertPath, []byte(rootCACert), 0644)
err = os.WriteFile(configFileData.CaCertPath, []byte(rootCACert), 0644)
if err != nil {
return fmt.Errorf("cannot write root CA cert: %v", err)
}
err = os.MkdirAll(filepath.Dir(configFileData.CertPath), 0644)
if err != nil {
return fmt.Errorf("cannot create directory to place server cert: %v", err)
}
err = ioutil.WriteFile(configFileData.CertPath, []byte(cert), 0644)
err = os.WriteFile(configFileData.CertPath, []byte(cert), 0644)
if err != nil {
return fmt.Errorf("cannot write server cert: %v", err)
}
err = os.MkdirAll(filepath.Dir(configFileData.KeyPath), 0644)
if err != nil {
return fmt.Errorf("cannot create directory to place server key: %v", err)
}
err = ioutil.WriteFile(configFileData.KeyPath, []byte(key), 0600)
err = os.WriteFile(configFileData.KeyPath, []byte(key), 0600)
if err != nil {
return fmt.Errorf("cannot write server key: %v", err)
}
Expand All @@ -204,4 +202,4 @@ func WireUpAPIServer() (svc *api.ServerAPI, config *configuration.Config, f form
svc = new(api.ServerAPI)
svc.HTTPClient = *ds
return svc, config, f
}
}
31 changes: 22 additions & 9 deletions cmd/agent/bootstrapping/ansible.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
// Copyright (c) 2017-2022 Ingram Micro Inc.

package bootstrapping

import (
"context"
"fmt"
"github.com/ingrammicro/cio/api"
"github.com/ingrammicro/cio/logger"
"github.com/ingrammicro/cio/types"
"os"
"path/filepath"

"github.com/ingrammicro/cio/api/blueprint"
"github.com/ingrammicro/cio/api/types"
"github.com/ingrammicro/cio/utils/format"
log "github.com/sirupsen/logrus"
"gopkg.in/yaml.v3"
Expand All @@ -23,10 +26,12 @@ const (
func applyAnsiblePolicyfiles(
ctx context.Context,
blueprintConfig *types.BootstrappingConfiguration,
bootstrappingSvc *blueprint.BootstrappingService,
svc *api.ServerAPI,
bsProcess *bootstrappingProcess,
formatter format.Formatter,
) error {
logger.DebugFuncInfo()

err := prepareAnsibleInventory(ctx, bsProcess)
if err != nil {
formatter.PrintError("couldn't prepare inventory:", err)
Expand All @@ -37,7 +42,7 @@ func applyAnsiblePolicyfiles(
formatter.PrintError("couldn't prepare variables:", err)
return err
}
err = processAnsiblePolicyfiles(blueprintConfig, bootstrappingSvc, bsProcess)
err = processAnsiblePolicyfiles(ctx, blueprintConfig, svc, bsProcess)
if err != nil {
formatter.PrintError("couldn't process policyfiles:", err)
return err
Expand All @@ -46,7 +51,8 @@ func applyAnsiblePolicyfiles(
}

func prepareAnsibleInventory(ctx context.Context, bsProcess *bootstrappingProcess) error {
log.Debug("prepareAnsibleInventory")
logger.DebugFuncInfo()

file, err := os.Create(inventoryFilePath(bsProcess.directoryPath))
if err != nil {
return fmt.Errorf("opening inventory file to write: %w", err)
Expand All @@ -71,7 +77,8 @@ func prepareAnsibleInventory(ctx context.Context, bsProcess *bootstrappingProces
}

func prepareAnsibleVariables(ctx context.Context, bsProcess *bootstrappingProcess) error {
log.Debug("prepareAnsibleVariables")
logger.DebugFuncInfo()

file, err := os.Create(variableFilePath(bsProcess.directoryPath))
if err != nil {
return fmt.Errorf("opening variable file to write: %w", err)
Expand All @@ -95,8 +102,14 @@ func variableFilePath(dir string) string {
}

// processAnsiblePolicyfiles applies for each policy the required ansible-galaxy and ansible-playbook commands, reporting in bunches of N lines
func processAnsiblePolicyfiles(blueprintConfig *types.BootstrappingConfiguration, bootstrappingSvc *blueprint.BootstrappingService, bsProcess *bootstrappingProcess) error {
log.Debug("processAnsiblePolicyfiles")
func processAnsiblePolicyfiles(
ctx context.Context,
blueprintConfig *types.BootstrappingConfiguration,
svc *api.ServerAPI,
bsProcess *bootstrappingProcess,
) error {
logger.DebugFuncInfo()

for _, bsPolicyfile := range bsProcess.policyfiles {
policyfileDir := bsPolicyfile.Path(bsProcess.directoryPath)
command := fmt.Sprintf(
Expand All @@ -106,7 +119,7 @@ func processAnsiblePolicyfiles(blueprintConfig *types.BootstrappingConfiguration
log.Debug(command)
bsProcess.cmsVersion = ""
// Custom method for chunks processing
fn := getBootstrapLogReporter(bootstrappingSvc, bsProcess, blueprintConfig)
fn := getBootstrapLogReporter(ctx, svc, bsProcess, blueprintConfig)
if err := runCommand(fn, command, bsProcess.thresholdLines); err != nil {
return err
}
Expand Down
40 changes: 24 additions & 16 deletions cmd/agent/bootstrapping/bootstrapping.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"fmt"
"github.com/ingrammicro/cio/cmd/agent"

"io/ioutil"
"math/rand"
"net/url"
"os"
Expand Down Expand Up @@ -316,12 +315,13 @@ func runBootstrapOnce(ctx context.Context, config *configuration.Config, formatt
// Subsidiary routine for commands processing
func applyPolicyfiles(
ctx context.Context,
bootstrappingSvc *blueprint.BootstrappingService,
svc *api.ServerAPI,
blueprintConfig *types.BootstrappingConfiguration,
formatter format.Formatter,
thresholdLines int,
) error {
log.Debug("applyPolicyfiles")
logger.DebugFuncInfo()

err := generateWorkspaceDir()
if err != nil {
formatter.PrintError("couldn't generated workspace directory", err)
Expand All @@ -341,7 +341,7 @@ func applyPolicyfiles(
}
// For every policyfile, ensure its tarball (downloadable through their download_url) has been downloaded to the
// server ...
err = downloadPolicyfiles(ctx, bootstrappingSvc, bsProcess)
err = downloadPolicyfiles(ctx, svc, bsProcess)
if err != nil {
formatter.PrintError("couldn't download policy files", err)
return err
Expand All @@ -353,9 +353,9 @@ func applyPolicyfiles(
return err
}
if blueprintConfig.ConfigurationManagementSystem == CMSChef {
err = applyChefPolicyfiles(ctx, blueprintConfig, bootstrappingSvc, bsProcess, formatter)
err = applyChefPolicyfiles(ctx, blueprintConfig, svc, bsProcess, formatter)
} else if blueprintConfig.ConfigurationManagementSystem == CMSAnsible {
err = applyAnsiblePolicyfiles(ctx, blueprintConfig, bootstrappingSvc, bsProcess, formatter)
err = applyAnsiblePolicyfiles(ctx, blueprintConfig, svc, bsProcess, formatter)
} else {
return fmt.Errorf("unknown configuration management system %q, expected %q or %q", blueprintConfig.ConfigurationManagementSystem, CMSChef, CMSAnsible)
}
Expand All @@ -365,7 +365,7 @@ func applyPolicyfiles(
// Inform the platform of applied changes via a `PUT /blueprint/applied_configuration` request with a JSON payload
// similar to
log.Debug("reporting applied policy files")
reportErr := reportAppliedConfiguration(bootstrappingSvc, bsProcess)
reportErr := reportAppliedConfiguration(ctx, svc, bsProcess)
if reportErr != nil {
formatter.PrintError("couldn't report applied status for policy files", err)
return err
Expand Down Expand Up @@ -405,6 +405,7 @@ func getBlueprintConfig(
formatter format.Formatter,
) (*types.BootstrappingConfiguration, bool, error) {
logger.DebugFuncInfo()

// Inquire about desired configuration changes to be applied by querying the `GET /blueprint/configuration`
// endpoint. This will provide a JSON response with the desired configuration changes
blueprintConfig, status, err := svc.GetBootstrappingConfiguration(cmd.GetContext())
Expand Down Expand Up @@ -433,20 +434,24 @@ func getBlueprintConfig(
}

func getBootstrapLogReporter(
bootstrappingSvc *blueprint.BootstrappingService,
ctx context.Context,
svc *api.ServerAPI,
bsProcess *bootstrappingProcess,
blueprintConfig *types.BootstrappingConfiguration) func(chunk string) error {
blueprintConfig *types.BootstrappingConfiguration,
) func(chunk string) error {
logger.DebugFuncInfo()

fn := func(chunk string) error {
log.Debug("sendChunks")
err := utils.Retry(retriesNumber, time.Second, func() error {
err := agent.Retry(retriesNumber, time.Second, func() error {
log.Debug("Sending: ", chunk)
bsProcess.parseCMSVersion(blueprintConfig, chunk)

commandIn := map[string]interface{}{
"stdout": chunk,
}

_, statusCode, err := bootstrappingSvc.ReportBootstrappingLog(&commandIn)
_, statusCode, err := svc.ReportBootstrappingLog(ctx, &commandIn)
switch {
// 0<100 error cases??
case statusCode == 0:
Expand All @@ -470,25 +475,28 @@ func getBootstrapLogReporter(

// reportAppliedConfiguration Inform the platform of applied changes
func reportAppliedConfiguration(
bootstrappingSvc *blueprint.BootstrappingService,
ctx context.Context,
svc *api.ServerAPI,
bsProcess *bootstrappingProcess,
) error {
log.Debug("reportAppliedConfiguration")
logger.DebugFuncInfo()

payload := map[string]interface{}{
"started_at": bsProcess.startedAt,
"finished_at": bsProcess.finishedAt,
"policyfile_revision_ids": bsProcess.appliedPolicyfileRevisionIDs,
"attribute_revision_id": bsProcess.attributes.revisionID,
"agent_version": utils.VERSION,
"agent_version": configuration.VERSION,
}
if bsProcess.cmsVersion != "" {
payload["cms_version"] = bsProcess.cmsVersion
}
return bootstrappingSvc.ReportBootstrappingAppliedConfiguration(&payload)
return svc.ReportBootstrappingAppliedConfiguration(ctx, &payload)
}

func (bsProcess *bootstrappingProcess) parseCMSVersion(blueprintConfig *types.BootstrappingConfiguration, chunk string) {
logger.DebugFuncInfo()

if bsProcess.cmsVersion != "" {
return
}
Expand Down Expand Up @@ -550,7 +558,7 @@ func cleanObsoletePolicyfiles(bsProcess *bootstrappingProcess) error {
logger.DebugFuncInfo()

// evaluates working folder
deletableFiles, err := ioutil.ReadDir(bsProcess.directoryPath)
deletableFiles, err := os.ReadDir(bsProcess.directoryPath)
if err != nil {
return err
}
Expand Down
Loading

0 comments on commit 47587ea

Please sign in to comment.