feat(inputs.openstack): Use service catalog from v3 authentication if available (#15460)

This commit is contained in:
Sven Rebhan 2024-06-07 17:17:50 -04:00 committed by GitHub
parent 5c3aa87340
commit 94a5ab60b8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 45 additions and 4 deletions

View File

@ -36,6 +36,7 @@ import (
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/openstack/identity/v3/projects"
"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/networks"
"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.openstackHypervisors = []hypervisors.Hypervisor{}
o.openstackProjects = map[string]projects.Project{}
o.openstackServices = map[string]services.Service{}
// Authenticate against Keystone and get a token provider
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)
}
// Determine the services available at the endpoint
if err := o.availableServices(); err != nil {
return fmt.Errorf("failed to get resource openstack services: %w", err)
// Check if we got a v3 authentication as we can skip the service listing
// in this case and extract the services from the authentication response.
// 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
@ -317,6 +325,37 @@ func (o *OpenStack) Gather(acc telegraf.Accumulator) error {
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
func (o *OpenStack) availableServices() error {
page, err := services.List(o.identity, nil).AllPages()
@ -327,6 +366,8 @@ func (o *OpenStack) availableServices() error {
if err != nil {
return fmt.Errorf("unable to extract services: %w", err)
}
o.openstackServices = make(map[string]services.Service, len(extractedServices))
for _, service := range extractedServices {
o.openstackServices[service.ID] = service
}