Skip to content

Commit

Permalink
Add liquid nova service info endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
Varsius committed Nov 22, 2024
1 parent ed48326 commit b47ded3
Show file tree
Hide file tree
Showing 17 changed files with 143 additions and 4 deletions.
24 changes: 24 additions & 0 deletions docs/liquids/nova.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Liquid: `nova`

This liquid provides support for the compute service Nova.

- The suggested service type is `liquid-nova`.
- The suggested area is `compute`.

## Service-specific configuration

TODO

## Resources

TODO: Description

| Resource | Unit | Capabilities |
| --- | --- | --- |
| `cores` | None | HasCapacity = true, HasQuota = true |
| `ram` | MiB | HasCapacity = true, HasQuota = true |
| `instances` | None | HasCapacity = true, HasQuota = true |
| `server_groups` | None | HasCapacity = false, HasQuota = true |
| `server_groups_members` | None | HasCapacity = false, HasQuota = true |
| `$FLAVOR_NAME` | None | HasCapacity = true, HasQuota = true |

2 changes: 1 addition & 1 deletion internal/liquids/ironic/liquid.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import (
"github.com/sapcc/go-api-declarations/liquid"

"github.com/sapcc/limes/internal/liquids"
"github.com/sapcc/limes/internal/plugins/nova"
"github.com/sapcc/limes/internal/liquids/nova"
)

type Logic struct {
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
112 changes: 112 additions & 0 deletions internal/liquids/nova/liquid.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
/*******************************************************************************
*
* Copyright 2024 SAP SE
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You should have received a copy of the License along with this
* program. If not, 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 nova

import (
"context"
"errors"
"time"

"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/openstack"
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/flavors"
"github.com/sapcc/go-api-declarations/liquid"
)

type Logic struct {
NovaV2 *gophercloud.ServiceClient `yaml:"-"`
}

// Init implements the liquidapi.Logic interface.
func (l *Logic) Init(ctx context.Context, provider *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (err error) {
l.NovaV2, err = openstack.NewComputeV2(provider, eo)
if err != nil {
return err
}
l.NovaV2.Microversion = "2.61" // to include extra specs in flavors.ListDetail()

return nil
}

// BuildServiceInfo implements the liquidapi.Logic interface.
func (l *Logic) BuildServiceInfo(ctx context.Context) (liquid.ServiceInfo, error) {
resources := map[liquid.ResourceName]liquid.ResourceInfo{
"cores": {
Unit: liquid.UnitNone,
HasCapacity: true,
HasQuota: true,
},
"instances": {
Unit: liquid.UnitNone,
HasCapacity: true,
HasQuota: true,
},
"ram": {
Unit: liquid.UnitMebibytes,
HasCapacity: true,
HasQuota: true,
},
"server_groups": {
Unit: liquid.UnitNone,
HasQuota: true,
},
"server_group_members": {
Unit: liquid.UnitNone,
HasQuota: true,
},
}

err := FlavorSelection{}.ForeachFlavor(ctx, l.NovaV2, func(f flavors.Flavor) error {
if f.ExtraSpecs["capabilities:hypervisor_type"] == "ironic" {
return nil
}
if f.ExtraSpecs["quota:separate"] == "true" {
resources[liquid.ResourceName(f.Name)] = liquid.ResourceInfo{
Unit: liquid.UnitNone,
HasCapacity: true,
HasQuota: true,
}
}
return nil
})
if err != nil {
return liquid.ServiceInfo{}, err
}

return liquid.ServiceInfo{
Version: time.Now().Unix(),
Resources: resources,
}, nil
}

// ScanCapacity implements the liquidapi.Logic interface.
func (l *Logic) ScanCapacity(ctx context.Context, req liquid.ServiceCapacityRequest, serviceInfo liquid.ServiceInfo) (liquid.ServiceCapacityReport, error) {
return liquid.ServiceCapacityReport{}, errors.New("TODO")
}

// ScanUsage implements the liquidapi.Logic interface.
func (l *Logic) ScanUsage(ctx context.Context, projectUUID string, req liquid.ServiceUsageRequest, serviceInfo liquid.ServiceInfo) (liquid.ServiceUsageReport, error) {
return liquid.ServiceUsageReport{}, errors.New("TODO")
}

// SetQuota implements the liquidapi.Logic interface.
func (l *Logic) SetQuota(ctx context.Context, projectUUID string, req liquid.ServiceQuotaRequest, serviceInfo liquid.ServiceInfo) error {
return errors.New("TODO")
}
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion internal/plugins/capacity_nova.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import (
"github.com/sapcc/limes/internal/core"
"github.com/sapcc/limes/internal/db"
"github.com/sapcc/limes/internal/liquids"
"github.com/sapcc/limes/internal/plugins/nova"
"github.com/sapcc/limes/internal/liquids/nova"
)

type capacityNovaPlugin struct {
Expand Down
2 changes: 1 addition & 1 deletion internal/plugins/nova.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import (

"github.com/sapcc/limes/internal/core"
"github.com/sapcc/limes/internal/db"
"github.com/sapcc/limes/internal/plugins/nova"
"github.com/sapcc/limes/internal/liquids/nova"
)

type novaPlugin struct {
Expand Down
2 changes: 1 addition & 1 deletion internal/plugins/nova_subresources.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import (
"github.com/sapcc/go-api-declarations/limes"

"github.com/sapcc/limes/internal/core"
"github.com/sapcc/limes/internal/plugins/nova"
"github.com/sapcc/limes/internal/liquids/nova"
)

// A compute instance as shown in our compute/instances subresources.
Expand Down
3 changes: 3 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ import (
"github.com/sapcc/limes/internal/liquids/ironic"
"github.com/sapcc/limes/internal/liquids/manila"
"github.com/sapcc/limes/internal/liquids/neutron"
"github.com/sapcc/limes/internal/liquids/nova"
"github.com/sapcc/limes/internal/liquids/octavia"
"github.com/sapcc/limes/internal/liquids/swift"
"github.com/sapcc/limes/internal/util"
Expand Down Expand Up @@ -120,6 +121,8 @@ func main() {
must.Succeed(liquidapi.Run(ctx, &manila.Logic{}, opts))
case "neutron":
must.Succeed(liquidapi.Run(ctx, &neutron.Logic{}, opts))
case "nova":
must.Succeed(liquidapi.Run(ctx, &nova.Logic{}, opts))
case "octavia":
must.Succeed(liquidapi.Run(ctx, &octavia.Logic{}, opts))
case "swift":
Expand Down

0 comments on commit b47ded3

Please sign in to comment.