读取流程如下列几张图
除了constant里有一个指定的configruation.poml外,这里有读取配置文件代码
github.com/edgexfoundry/go-mod-bootstrap/v2@v2.0.0/bootstrap/config/config.go
下面是解析配置文件测试
1、首先根据提取读取配置文件的方法及结构体定义,放到一个文件中进行测试,代码如下
/*******************************************************************************
* Copyright 2021 Intel Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*
*******************************************************************************/
package main
import (
"fmt"
"os"
"strings"
"github.com/BurntSushi/toml"
bootstrapConfig "github.com/edgexfoundry/go-mod-bootstrap/v2/config"
)
// BootStrapperInfo defines the first stage gate info
// It is the first stage gate of security bootstrapping
type BootStrapperInfo struct {
Host string
StartPort int
}
// ReadyInfo defines the ready stage gate info
// It is the last stage gate of security bootstrapping for
// Kong, and all other Edgex core services
type ReadyInfo struct {
ToRunPort int
}
// TokensInfo defines the tokens ready stage gate info
// for the secretstore setup (formerly known as vault-worker)
type TokensInfo struct {
ReadyPort int
}
// SecretStoreSetupInfo defines the fields related to
// stage gating the secretstore setup (formerly known as vault-worker) bootstrapping
type SecretStoreSetupInfo struct {
Host string
Tokens TokensInfo
}
// DatabaseInfo defines the fields related to
// stage gating the database bootstrapping
type DatabaseInfo struct {
Host string
Port int
ReadyPort int
}
// RegistryInfo defines the fields related to
// stage gating the registry bootstrapping
type RegistryInfo struct {
Host string
Port int
ReadyPort int
ACL ACLInfo
}
// ACLInfo defines the fields related to Registry's ACL process
type ACLInfo struct {
// the protocol used for registry's API calls, usually it is different from the protocol of waitFor, i.e. TCP
Protocol string
// filepath to save the registry's token generated from ACL bootstrapping
BootstrapTokenPath string
// filepath for the secretstore's token created from secretstore-setup
SecretsAdminTokenPath string
// filepath for the sentinel file to indicate the registry ACL is set up successfully
SentinelFilePath string
// filepath to save the registry's token created for management purposes
ManagementTokenPath string
// the roles for registry role-based access control list
Roles map[string]ACLRoleInfo
}
// ACLRoleInfo defines the fields related to Registry's ACL roles
type ACLRoleInfo struct {
// the details about the role
Description string
}
// KongDBInfo defines the fields related to
// stage gating the Kong's database bootstrapping
type KongDBInfo struct {
Host string
Port int
ReadyPort int
}
type WaitForInfo struct {
Timeout string
RetryInterval string
}
// StageGateInfo defines the gate info for the security bootstrapper
// in different stages for services. From the TOML structure perspective,
// it is segmented in the way that environment variables are easier
// to read when they become all upper cases in the environment override.
type StageGateInfo struct {
BootStrapper BootStrapperInfo
Ready ReadyInfo
SecretStoreSetup SecretStoreSetupInfo
Database DatabaseInfo
Registry RegistryInfo
KongDB KongDBInfo
WaitFor WaitForInfo
}
type ConfigurationStruct struct {
LogLevel string
StageGate StageGateInfo
SecretStore bootstrapConfig.SecretStoreInfo
}
// UpdateFromRaw converts configuration received from the registry to a service-specific configuration struct which is
// then used to overwrite the service's existing configuration struct.
func (c *ConfigurationStruct) UpdateFromRaw(rawConfig interface{}) bool {
return false
}
// EmptyWritablePtr returns a pointer to a service-specific empty WritableInfo struct. It is used by the bootstrap to
// provide the appropriate structure to registry.Client's WatchForChanges().
func (c *ConfigurationStruct) EmptyWritablePtr() interface{} {
return nil
}
// UpdateWritableFromRaw converts configuration received from the registry to a service-specific WritableInfo struct
// which is then used to overwrite the service's existing configuration's WritableInfo struct.
func (c *ConfigurationStruct) UpdateWritableFromRaw(rawWritable interface{}) bool {
return false
}
// GetBootstrap returns the configuration elements required by the bootstrap. Currently, a copy of the configuration
// data is returned. This is intended to be temporary -- since ConfigurationStruct drives the configuration.toml's
// structure -- until we can make backwards-breaking configuration.toml changes (which would consolidate these fields
// into an bootstrapConfig.BootstrapConfiguration struct contained within ConfigurationStruct).
func (c *ConfigurationStruct) GetBootstrap() bootstrapConfig.BootstrapConfiguration {
// temporary until we can make backwards-breaking configuration.toml change
return bootstrapConfig.BootstrapConfiguration{}
}
// GetLogLevel returns the current ConfigurationStruct's log level.
func (c *ConfigurationStruct) GetLogLevel() string {
return c.LogLevel
}
// GetRegistryInfo returns the RegistryInfo from the ConfigurationStruct.
func (c *ConfigurationStruct) GetRegistryInfo() bootstrapConfig.RegistryInfo {
return bootstrapConfig.RegistryInfo{}
}
// GetDatabaseInfo returns a database information map.
func (c *ConfigurationStruct) GetDatabaseInfo() map[string]bootstrapConfig.Database {
return nil
}
// GetInsecureSecrets returns the service's InsecureSecrets.
func (c *ConfigurationStruct) GetInsecureSecrets() bootstrapConfig.InsecureSecrets {
return nil
}
// GetRoleNames gets the slice of the keys (i.e. the service keys) from map Roles as ACL role names
func (acl ACLInfo) GetACLRoleNames() []string {
roleNames := make([]string, 0, len(acl.Roles))
for serviceKey := range acl.Roles {
// always converts to lower cases by design
roleNames = append(roleNames, strings.ToLower(serviceKey))
}
return roleNames
}
func main() {
fileName := "./res/configuration.toml"
contents, err := os.ReadFile(fileName)
if err != nil {
fmt.Println("could not load configuration file (%s): %s", fileName, err.Error())
return
}
configuration := &ConfigurationStruct{}
err = toml.Unmarshal(contents, configuration)
if err != nil {
fmt.Println("unable to parse configuration file (%s): %s", fileName, err.Error())
return
}
//aa := GetBootstrap(s)
fmt.Println(configuration)
fmt.Println(configuration.GetLogLevel())
}
2、配置文件内容
LogLevel = 'INFO'
[StageGate]
[StageGate.BootStrapper]
Host = "edgex-security-bootstrapper"
StartPort = 54321
[StageGate.Ready]
ToRunPort = 54329
[StageGate.SecretStoreSetup]
Host = "edgex-secretstore-setup"
[StageGate.SecretStoreSetup.Tokens]
ReadyPort = 54322
[StageGate.Database]
# this is intended to be the same as Database.Primary.Host/.Port for other services
Host = "edgex-redis"
Port = 6379
ReadyPort = 54323
[StageGate.Registry]
# this is intended to be the same as Registry.Host/.Port for other services
Host = "edgex-core-consul"
Port = 8500
ReadyPort = 54324
[StageGate.Registry.ACL]
Protocol = "http"
# this is the filepath for the generated Consul management token from ACL bootstrap
BootstrapTokenPath = "/tmp/edgex/secrets/consul-acl-token/bootstrap_token.json"
# this is the filepath for the Vault token created from secretstore-setup
SecretsAdminTokenPath = "/tmp/edgex/secrets/edgex-consul/admin/token.json"
# this is the filepath for the sentinel file to indicate the registry ACL is set up successfully
SentinelFilePath = "/edgex-init/consul-bootstrapper/consul_acl_done"
# this is the filepath for the created Consul management token
ManagementTokenPath = "/tmp/edgex/secrets/consul-acl-token/mgmt_token.json"
# this section contains the list of registry roles for EdgeX services
# the service keys are the role names
[StageGate.Registry.ACL.Roles]
[StageGate.Registry.ACL.Roles.app-rules-engine]
Description = "role for application service of rules engine"
[StageGate.Registry.ACL.Roles.core-data]
Description = "role for coredata"
[StageGate.Registry.ACL.Roles.core-metadata]
Description = "role for metadata"
[StageGate.Registry.ACL.Roles.core-command]
Description = "role for command"
[StageGate.Registry.ACL.Roles.support-notifications]
Description = "role for notifications"
[StageGate.Registry.ACL.Roles.support-scheduler]
Description = "role for scheduler"
[StageGate.Registry.ACL.Roles.sys-mgmt-agent]
Description = "role for system management agent"
[StageGate.Registry.ACL.Roles.device-virtual]
Description = "role for device virtual service"
[StageGate.Registry.ACL.Roles.device-rest]
Description = "role for device rest service"
[StageGate.KongDb]
Host = "kong-db"
Port = 5432
ReadyPort = 54325
[StageGate.WaitFor]
Timeout = "10s"
RetryInterval = "1s"
# this configuration is just part of the whole go-mod-bootstrap's secret store to have
# protocol, host, and port of secretstore using in the security-bootstrapper
# we are not really using the secret store provider from go-mod-bootstrap in the code
# also this is needed as snap does not have those environments from env-files
[SecretStore]
Type = 'vault'
Protocol = 'http'
Host = 'localhost'
Port = 8200
3、路径在./res/configuration.toml
4、运行结果