Visitar URL original
feat: add network segment range extension to networking v2 by cardoe · Pull Request #3614 · gophercloud/gophercloud · GitHub
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions openstack/networking/v2/extensions/networksegmentranges/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
Package networksegmentranges provides the ability to retrieve and manage
network segment ranges through the Neutron API.

Network segment ranges define pools of segmentation IDs that can be used for
dynamic segment allocation in provider networks.

Example of Listing Network Segment Ranges

listOpts := networksegmentranges.ListOpts{
NetworkType: "vxlan",
}

allPages, err := networksegmentranges.List(networkClient, listOpts).AllPages(context.TODO())
if err != nil {
panic(err)
}

allRanges, err := networksegmentranges.ExtractNetworkSegmentRanges(allPages)
if err != nil {
panic(err)
}

for _, r := range allRanges {
fmt.Printf("%+v\n", r)
}

Example to Get a Network Segment Range

rangeID := "59b2f3a1-09aa-49e4-b9f7-8d7c81f7c7e5"
segmentRange, err := networksegmentranges.Get(context.TODO(), networkClient, rangeID).Extract()
if err != nil {
panic(err)
}

Example to Create a Network Segment Range

createOpts := networksegmentranges.CreateOpts{
Name: "vxlan-range",
NetworkType: "vxlan",
Minimum: 1000,
Maximum: 2000,
}
segmentRange, err := networksegmentranges.Create(context.TODO(), networkClient, createOpts).Extract()
if err != nil {
panic(err)
}

Example to Update a Network Segment Range

rangeID := "59b2f3a1-09aa-49e4-b9f7-8d7c81f7c7e5"
name := "updated-range"
minimum := 1500
updateOpts := networksegmentranges.UpdateOpts{
Name: &name,
Minimum: &minimum,
}
segmentRange, err := networksegmentranges.Update(context.TODO(), networkClient, rangeID, updateOpts).Extract()
if err != nil {
panic(err)
}

Example to Delete a Network Segment Range

rangeID := "59b2f3a1-09aa-49e4-b9f7-8d7c81f7c7e5"
err := networksegmentranges.Delete(context.TODO(), networkClient, rangeID).ExtractErr()
if err != nil {
panic(err)
}
*/
package networksegmentranges
127 changes: 127 additions & 0 deletions openstack/networking/v2/extensions/networksegmentranges/requests.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package networksegmentranges

import (
"context"

"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/pagination"
)

// ListOpts allows filtering when listing network segment ranges.
type ListOpts struct {
ID string `q:"id"`
Name string `q:"name"`
Default *bool `q:"default"`
Shared *bool `q:"shared"`
ProjectID string `q:"project_id"`
NetworkType string `q:"network_type"`
PhysicalNetwork string `q:"physical_network"`
Minimum int `q:"minimum"`
Maximum int `q:"maximum"`
SortDir string `q:"sort_dir"`
SortKey string `q:"sort_key"`
}

type ListOptsBuilder interface {
ToNetworkSegmentRangeListQuery() (string, error)
}

func (opts ListOpts) ToNetworkSegmentRangeListQuery() (string, error) {
q, err := gophercloud.BuildQueryString(opts)
if err != nil {
return "", err
}
return q.String(), nil
}

// List retrieves a list of network segment ranges.
func List(c *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager {
url := listURL(c)
if opts != nil {
query, err := opts.ToNetworkSegmentRangeListQuery()
if err != nil {
return pagination.Pager{Err: err}
}
url += query
}
return pagination.NewPager(c, url, func(r pagination.PageResult) pagination.Page {
return NetworkSegmentRangePage{pagination.LinkedPageBase{PageResult: r}}
})
}

type CreateOptsBuilder interface {
ToNetworkSegmentRangeCreateMap() (map[string]any, error)
}

// CreateOpts represents options for creating a network segment range.
type CreateOpts struct {
Name string `json:"name,omitempty"`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Default *bool `json:"default,omitempty"`
Shared *bool `json:"shared,omitempty"`
ProjectID string `json:"project_id,omitempty"`
NetworkType string `json:"network_type" required:"true"`
PhysicalNetwork string `json:"physical_network,omitempty"`
Minimum int `json:"minimum" required:"true"`
Maximum int `json:"maximum" required:"true"`
}

func (opts CreateOpts) ToNetworkSegmentRangeCreateMap() (map[string]any, error) {
return gophercloud.BuildRequestBody(opts, "network_segment_range")
}

// Create creates a new network segment range.
func Create(ctx context.Context, c *gophercloud.ServiceClient, opts CreateOptsBuilder) (r CreateResult) {
b, err := opts.ToNetworkSegmentRangeCreateMap()
if err != nil {
r.Err = err
return
}
resp, err := c.Post(ctx, createURL(c), b, &r.Body, &gophercloud.RequestOpts{
OkCodes: []int{201},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}

// Get retrieves a specific network segment range.
func Get(ctx context.Context, c *gophercloud.ServiceClient, id string) (r GetResult) {
resp, err := c.Get(ctx, getURL(c, id), &r.Body, nil)
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}

type UpdateOptsBuilder interface {
ToNetworkSegmentRangeUpdateMap() (map[string]any, error)
}

// UpdateOpts represents options for updating a network segment range.
type UpdateOpts struct {
Name *string `json:"name,omitempty"`
Minimum *int `json:"minimum,omitempty"`
Maximum *int `json:"maximum,omitempty"`
}

func (opts UpdateOpts) ToNetworkSegmentRangeUpdateMap() (map[string]any, error) {
return gophercloud.BuildRequestBody(opts, "network_segment_range")
}

// Update modifies a network segment range.
func Update(ctx context.Context, c *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) (r UpdateResult) {
b, err := opts.ToNetworkSegmentRangeUpdateMap()
if err != nil {
r.Err = err
return
}
resp, err := c.Put(ctx, updateURL(c, id), b, &r.Body, &gophercloud.RequestOpts{
OkCodes: []int{200},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}

// Delete removes a network segment range.
func Delete(ctx context.Context, c *gophercloud.ServiceClient, id string) (r DeleteResult) {
resp, err := c.Delete(ctx, deleteURL(c, id), nil)
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
74 changes: 74 additions & 0 deletions openstack/networking/v2/extensions/networksegmentranges/results.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package networksegmentranges

import (
"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/pagination"
)

type commonResult struct {
gophercloud.Result
}

// Extract interprets a network segment range result as a NetworkSegmentRange.
func (r commonResult) Extract() (*NetworkSegmentRange, error) {
var s struct {
NetworkSegmentRange *NetworkSegmentRange `json:"network_segment_range"`
}
err := r.ExtractInto(&s)
return s.NetworkSegmentRange, err
}

// CreateResult represents the result of a create operation.
type CreateResult struct {
commonResult
}

// GetResult represents the result of a get operation.
type GetResult struct {
commonResult
}

// UpdateResult represents the result of an update operation.
type UpdateResult struct {
commonResult
}

// DeleteResult represents the result of a delete operation.
type DeleteResult struct {
gophercloud.ErrResult
}

// NetworkSegmentRange represents a network segment range.
type NetworkSegmentRange struct {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we add all fields? We're currently missing:

  • Description
  • TenantID (not sure this one is relevant anymore)
  • CreatedAt
  • UpdatedAt
  • RevisionNumber
  • Tags

ID string `json:"id"`
Name string `json:"name"`
Default bool `json:"default"`
Shared bool `json:"shared"`
ProjectID string `json:"project_id"`
NetworkType string `json:"network_type"`
PhysicalNetwork string `json:"physical_network"`
Minimum int `json:"minimum"`
Maximum int `json:"maximum"`
Used map[int]string `json:"used"`
Available []int `json:"available"`
}

// NetworkSegmentRangePage is the page returned by a pager when traversing over a collection of network segment ranges.
type NetworkSegmentRangePage struct {
pagination.LinkedPageBase
}

// IsEmpty checks whether a NetworkSegmentRangePage struct is empty.
func (r NetworkSegmentRangePage) IsEmpty() (bool, error) {
is, err := ExtractNetworkSegmentRanges(r)
return len(is) == 0, err
}

// ExtractNetworkSegmentRanges accepts a Page struct and extracts the elements into a slice of NetworkSegmentRange structs.
func ExtractNetworkSegmentRanges(r pagination.Page) ([]NetworkSegmentRange, error) {
var s struct {
NetworkSegmentRanges []NetworkSegmentRange `json:"network_segment_ranges"`
}
err := (r.(NetworkSegmentRangePage)).ExtractInto(&s)
return s.NetworkSegmentRanges, err
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// networksegmentranges unit tests
package testing
Loading