You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
consul/agent/hcp/scada/scada.go

98 lines
2.5 KiB

// Copyright (c) HashiCorp, Inc.
[COMPLIANCE] License changes (#18443) * Adding explicit MPL license for sub-package This directory and its subdirectories (packages) contain files licensed with the MPLv2 `LICENSE` file in this directory and are intentionally licensed separately from the BSL `LICENSE` file at the root of this repository. * Adding explicit MPL license for sub-package This directory and its subdirectories (packages) contain files licensed with the MPLv2 `LICENSE` file in this directory and are intentionally licensed separately from the BSL `LICENSE` file at the root of this repository. * Updating the license from MPL to Business Source License Going forward, this project will be licensed under the Business Source License v1.1. Please see our blog post for more details at <Blog URL>, FAQ at www.hashicorp.com/licensing-faq, and details of the license at www.hashicorp.com/bsl. * add missing license headers * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 --------- Co-authored-by: hashicorp-copywrite[bot] <110428419+hashicorp-copywrite[bot]@users.noreply.github.com>
1 year ago
// SPDX-License-Identifier: BUSL-1.1
package scada
import (
"fmt"
"net"
"github.com/hashicorp/consul/agent/hcp/config"
"github.com/hashicorp/go-hclog"
libscada "github.com/hashicorp/hcp-scada-provider"
"github.com/hashicorp/hcp-scada-provider/capability"
cloud "github.com/hashicorp/hcp-sdk-go/clients/cloud-shared/v1/models"
hcpcfg "github.com/hashicorp/hcp-sdk-go/config"
)
// Provider is the interface used in the rest of Consul core when using SCADA, it is aliased here to the same interface
// provided by the hcp-scada-provider library. If the interfaces needs to be extended in the future it can be done so
// with minimal impact on the rest of the codebase.
//
//go:generate mockery --name Provider --with-expecter --inpackage
type Provider interface {
libscada.SCADAProvider
UpdateHCPConfig(cfg config.CloudConfig) error
}
const (
scadaConsulServiceKey = "consul"
)
type scadaProvider struct {
libscada.SCADAProvider
logger hclog.Logger
}
// New returns an initialized SCADA provider with a zero configuration.
// It can listen but cannot start until UpdateHCPConfig is called with
// a configuration that provides credentials to contact HCP.
func New(logger hclog.Logger) (*scadaProvider, error) {
// Create placeholder resource link
resourceLink := cloud.HashicorpCloudLocationLink{
Type: "no-op",
ID: "no-op",
Location: &cloud.HashicorpCloudLocationLocation{},
}
// Configure with an empty HCP configuration
hcpConfig, err := hcpcfg.NewHCPConfig(hcpcfg.WithoutBrowserLogin())
if err != nil {
return nil, fmt.Errorf("failed to configure SCADA provider: %w", err)
}
pvd, err := libscada.New(&libscada.Config{
Service: scadaConsulServiceKey,
HCPConfig: hcpConfig,
Resource: resourceLink,
Logger: logger,
})
if err != nil {
return nil, err
}
return &scadaProvider{pvd, logger}, nil
}
// UpdateHCPConfig updates the SCADA provider with the given HCP
// configurations.
func (p *scadaProvider) UpdateHCPConfig(cfg config.CloudConfig) error {
resource, err := cfg.Resource()
if err != nil {
return err
}
hcpCfg, err := cfg.HCPConfig()
if err != nil {
return err
}
err = p.UpdateConfig(&libscada.Config{
Service: scadaConsulServiceKey,
HCPConfig: hcpCfg,
Resource: *resource.Link(),
Logger: p.logger,
})
if err != nil {
return err
}
return nil
}
// IsCapability takes a net.Addr and returns true if it is a SCADA capability.Addr
func IsCapability(a net.Addr) bool {
_, ok := a.(*capability.Addr)
return ok
}