feat(inputs.openstack): Use service catalog from v3 authentication if available (#15460)
This commit is contained in:
parent
5c3aa87340
commit
94a5ab60b8
|
|
@ -36,6 +36,7 @@ import (
|
||||||
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
||||||
"github.com/gophercloud/gophercloud/openstack/identity/v3/projects"
|
"github.com/gophercloud/gophercloud/openstack/identity/v3/projects"
|
||||||
"github.com/gophercloud/gophercloud/openstack/identity/v3/services"
|
"github.com/gophercloud/gophercloud/openstack/identity/v3/services"
|
||||||
|
"github.com/gophercloud/gophercloud/openstack/identity/v3/tokens"
|
||||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/agents"
|
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/agents"
|
||||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
|
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
|
||||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
|
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
|
||||||
|
|
@ -142,7 +143,6 @@ func (o *OpenStack) Start(_ telegraf.Accumulator) error {
|
||||||
o.openstackFlavors = map[string]flavors.Flavor{}
|
o.openstackFlavors = map[string]flavors.Flavor{}
|
||||||
o.openstackHypervisors = []hypervisors.Hypervisor{}
|
o.openstackHypervisors = []hypervisors.Hypervisor{}
|
||||||
o.openstackProjects = map[string]projects.Project{}
|
o.openstackProjects = map[string]projects.Project{}
|
||||||
o.openstackServices = map[string]services.Service{}
|
|
||||||
|
|
||||||
// Authenticate against Keystone and get a token provider
|
// Authenticate against Keystone and get a token provider
|
||||||
provider, err := openstack.NewClient(o.IdentityEndpoint)
|
provider, err := openstack.NewClient(o.IdentityEndpoint)
|
||||||
|
|
@ -186,9 +186,17 @@ func (o *OpenStack) Start(_ telegraf.Accumulator) error {
|
||||||
return fmt.Errorf("unable to create V2 network client: %w", err)
|
return fmt.Errorf("unable to create V2 network client: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determine the services available at the endpoint
|
// Check if we got a v3 authentication as we can skip the service listing
|
||||||
if err := o.availableServices(); err != nil {
|
// in this case and extract the services from the authentication response.
|
||||||
return fmt.Errorf("failed to get resource openstack services: %w", err)
|
// Otherwise we are falling back to the "services" API.
|
||||||
|
if success, err := o.availableServicesFromAuth(provider); !success || err != nil {
|
||||||
|
if err != nil {
|
||||||
|
o.Log.Warnf("failed to get services from v3 authentication: %v; falling back to services API", err)
|
||||||
|
}
|
||||||
|
// Determine the services available at the endpoint
|
||||||
|
if err := o.availableServices(); err != nil {
|
||||||
|
return fmt.Errorf("failed to get resource openstack services: %w", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup the optional services
|
// Setup the optional services
|
||||||
|
|
@ -317,6 +325,37 @@ func (o *OpenStack) Gather(acc telegraf.Accumulator) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o *OpenStack) availableServicesFromAuth(provider *gophercloud.ProviderClient) (bool, error) {
|
||||||
|
authResult := provider.GetAuthResult()
|
||||||
|
if authResult == nil {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
resultV3, ok := authResult.(tokens.CreateResult)
|
||||||
|
if !ok {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
catalog, err := resultV3.ExtractServiceCatalog()
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(catalog.Entries) == 0 {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
o.openstackServices = make(map[string]services.Service, len(catalog.Entries))
|
||||||
|
for _, entry := range catalog.Entries {
|
||||||
|
o.openstackServices[entry.ID] = services.Service{
|
||||||
|
ID: entry.ID,
|
||||||
|
Type: entry.Type,
|
||||||
|
Enabled: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
// availableServices collects the available endpoint services via API
|
// availableServices collects the available endpoint services via API
|
||||||
func (o *OpenStack) availableServices() error {
|
func (o *OpenStack) availableServices() error {
|
||||||
page, err := services.List(o.identity, nil).AllPages()
|
page, err := services.List(o.identity, nil).AllPages()
|
||||||
|
|
@ -327,6 +366,8 @@ func (o *OpenStack) availableServices() error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to extract services: %w", err)
|
return fmt.Errorf("unable to extract services: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
o.openstackServices = make(map[string]services.Service, len(extractedServices))
|
||||||
for _, service := range extractedServices {
|
for _, service := range extractedServices {
|
||||||
o.openstackServices[service.ID] = service
|
o.openstackServices[service.ID] = service
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue