Skip to content

Commit 11fcf95

Browse files
committed
Merge branch 'master' of https://github.com/metal-stack/metal-api into ipv6-support
2 parents 9f52dfd + ebd379a commit 11fcf95

File tree

19 files changed

+922
-461
lines changed

19 files changed

+922
-461
lines changed

cmd/metal-api/internal/datastore/migrations/06_childprefixlength.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
r "gopkg.in/rethinkdb/rethinkdb-go.v6"
55

66
"github.com/metal-stack/metal-api/cmd/metal-api/internal/datastore"
7+
"github.com/metal-stack/metal-api/cmd/metal-api/internal/metal"
78
)
89

910
func init() {
@@ -20,10 +21,6 @@ func init() {
2021
}
2122

2223
for _, old := range nws {
23-
if !old.PrivateSuper {
24-
continue
25-
}
26-
2724
cursor, err := db.Table("partition").Get(old.PartitionID).Run(session)
2825
if err != nil {
2926
return err
@@ -36,7 +33,17 @@ func init() {
3633

3734
// TODO: does not work somehow
3835
new := old
39-
new.ChildPrefixLength = &partition.PrivateNetworkPrefixLength
36+
37+
af, err := metal.GetAddressFamily(new.Prefixes)
38+
if err != nil {
39+
return err
40+
}
41+
if af != nil {
42+
new.AddressFamily = *af
43+
}
44+
if new.PrivateSuper {
45+
new.DefaultChildPrefixLength = &partition.PrivateNetworkPrefixLength
46+
}
4047
err = rs.UpdateNetwork(&old, &new)
4148
if err != nil {
4249
return err

cmd/metal-api/internal/datastore/migrations_integration/migrate_integration_test.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,20 +167,29 @@ func Test_MigrationChildPrefixLength(t *testing.T) {
167167
Base: metal.Base{
168168
ID: "n1",
169169
},
170-
PartitionID: "p1",
170+
PartitionID: "p1",
171+
Prefixes: metal.Prefixes{
172+
{IP: "10.0.0.0", Length: "8"},
173+
},
171174
PrivateSuper: true,
172175
}
173176
n2 = &metal.Network{
174177
Base: metal.Base{
175178
ID: "n2",
176179
},
180+
Prefixes: metal.Prefixes{
181+
{IP: "2001::", Length: "64"},
182+
},
177183
PartitionID: "p2",
178184
PrivateSuper: true,
179185
}
180186
n3 = &metal.Network{
181187
Base: metal.Base{
182188
ID: "n3",
183189
},
190+
Prefixes: metal.Prefixes{
191+
{IP: "100.1.0.0", Length: "22"},
192+
},
184193
PartitionID: "p2",
185194
PrivateSuper: false,
186195
}
@@ -210,15 +219,18 @@ func Test_MigrationChildPrefixLength(t *testing.T) {
210219
n1fetched, err := rs.FindNetworkByID(n1.ID)
211220
require.NoError(t, err)
212221
require.NotNil(t, n1fetched)
213-
require.Equal(t, p1.PrivateNetworkPrefixLength, *n1fetched.ChildPrefixLength, fmt.Sprintf("childprefixlength:%d", *n1fetched.ChildPrefixLength))
222+
require.Equal(t, p1.PrivateNetworkPrefixLength, *n1fetched.DefaultChildPrefixLength, fmt.Sprintf("childprefixlength:%d", *n1fetched.DefaultChildPrefixLength))
223+
require.Equal(t, metal.IPv4AddressFamily, n1fetched.AddressFamily)
214224

215225
n2fetched, err := rs.FindNetworkByID(n2.ID)
216226
require.NoError(t, err)
217227
require.NotNil(t, n2fetched)
218-
require.Equal(t, p2.PrivateNetworkPrefixLength, *n2fetched.ChildPrefixLength, fmt.Sprintf("childprefixlength:%d", *n2fetched.ChildPrefixLength))
228+
require.Equal(t, p2.PrivateNetworkPrefixLength, *n2fetched.DefaultChildPrefixLength, fmt.Sprintf("childprefixlength:%d", *n2fetched.DefaultChildPrefixLength))
229+
require.Equal(t, metal.IPv6AddressFamily, n2fetched.AddressFamily)
219230

220231
n3fetched, err := rs.FindNetworkByID(n3.ID)
221232
require.NoError(t, err)
222233
require.NotNil(t, n3fetched)
223-
require.Nil(t, n3fetched.ChildPrefixLength)
234+
require.Nil(t, n3fetched.DefaultChildPrefixLength)
235+
require.Equal(t, metal.IPv4AddressFamily, n3fetched.AddressFamily)
224236
}

cmd/metal-api/internal/datastore/network.go

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,19 @@ import (
1212

1313
// NetworkSearchQuery can be used to search networks.
1414
type NetworkSearchQuery struct {
15-
ID *string `json:"id" optional:"true"`
16-
Name *string `json:"name" optional:"true"`
17-
PartitionID *string `json:"partitionid" optional:"true"`
18-
ProjectID *string `json:"projectid" optional:"true"`
19-
Prefixes []string `json:"prefixes" optional:"true"`
20-
DestinationPrefixes []string `json:"destinationprefixes" optional:"true"`
21-
Nat *bool `json:"nat" optional:"true"`
22-
PrivateSuper *bool `json:"privatesuper" optional:"true"`
23-
Underlay *bool `json:"underlay" optional:"true"`
24-
Vrf *int64 `json:"vrf" optional:"true"`
25-
ParentNetworkID *string `json:"parentnetworkid" optional:"true"`
26-
Labels map[string]string `json:"labels" optional:"true"`
15+
ID *string `json:"id" optional:"true"`
16+
Name *string `json:"name" optional:"true"`
17+
PartitionID *string `json:"partitionid" optional:"true"`
18+
ProjectID *string `json:"projectid" optional:"true"`
19+
Prefixes []string `json:"prefixes" optional:"true"`
20+
DestinationPrefixes []string `json:"destinationprefixes" optional:"true"`
21+
Nat *bool `json:"nat" optional:"true"`
22+
PrivateSuper *bool `json:"privatesuper" optional:"true"`
23+
Underlay *bool `json:"underlay" optional:"true"`
24+
Vrf *int64 `json:"vrf" optional:"true"`
25+
ParentNetworkID *string `json:"parentnetworkid" optional:"true"`
26+
Labels map[string]string `json:"labels" optional:"true"`
27+
AddressFamily *metal.AddressFamily `json:"addressfamily" optional:"true"`
2728
}
2829

2930
func (p *NetworkSearchQuery) Validate() error {
@@ -104,6 +105,12 @@ func (p *NetworkSearchQuery) generateTerm(rs *RethinkStore) (*r.Term, error) {
104105
})
105106
}
106107

108+
if p.AddressFamily != nil {
109+
q = q.Filter(func(row r.Term) r.Term {
110+
return row.Field("addressfamily").Eq(string(*p.AddressFamily))
111+
})
112+
}
113+
107114
for k, v := range p.Labels {
108115
k := k
109116
v := v

cmd/metal-api/internal/datastore/rethinkdb.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ func (rs *RethinkStore) findEntity(query *r.Term, entity interface{}) error {
378378
}
379379
defer res.Close()
380380
if res.IsNil() {
381-
return metal.NotFound("no %v with found", getEntityName(entity))
381+
return metal.NotFound("no %v found", getEntityName(entity))
382382
}
383383

384384
hasResult := res.Next(entity)

cmd/metal-api/internal/datastore/size.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,65 @@ import (
44
"errors"
55

66
"github.com/metal-stack/metal-api/cmd/metal-api/internal/metal"
7+
r "gopkg.in/rethinkdb/rethinkdb-go.v6"
78
)
89

10+
// SizeSearchQuery can be used to search sizes.
11+
type SizeSearchQuery struct {
12+
ID *string `json:"id" optional:"true"`
13+
Name *string `json:"name" optional:"true"`
14+
Labels map[string]string `json:"labels" optional:"true"`
15+
Reservation Reservation `json:"reservation" optional:"true"`
16+
}
17+
18+
type Reservation struct {
19+
Partition *string `json:"partition" optional:"true"`
20+
Project *string `json:"project" optional:"true"`
21+
}
22+
23+
// GenerateTerm generates the project search query term.
24+
func (s *SizeSearchQuery) generateTerm(rs *RethinkStore) *r.Term {
25+
q := *rs.sizeTable()
26+
27+
if s.ID != nil {
28+
q = q.Filter(func(row r.Term) r.Term {
29+
return row.Field("id").Eq(*s.ID)
30+
})
31+
}
32+
33+
if s.Name != nil {
34+
q = q.Filter(func(row r.Term) r.Term {
35+
return row.Field("name").Eq(*s.Name)
36+
})
37+
}
38+
39+
for k, v := range s.Labels {
40+
k := k
41+
v := v
42+
q = q.Filter(func(row r.Term) r.Term {
43+
return row.Field("labels").Field(k).Eq(v)
44+
})
45+
}
46+
47+
if s.Reservation.Project != nil {
48+
q = q.Filter(func(row r.Term) r.Term {
49+
return row.Field("reservations").Contains(func(p r.Term) r.Term {
50+
return p.Field("projectid").Eq(r.Expr(*s.Reservation.Project))
51+
})
52+
})
53+
}
54+
55+
if s.Reservation.Partition != nil {
56+
q = q.Filter(func(row r.Term) r.Term {
57+
return row.Field("reservations").Contains(func(p r.Term) r.Term {
58+
return p.Field("partitionids").Contains(r.Expr(*s.Reservation.Partition))
59+
})
60+
})
61+
}
62+
63+
return &q
64+
}
65+
966
// FindSize return a size for a given id.
1067
func (rs *RethinkStore) FindSize(id string) (*metal.Size, error) {
1168
var s metal.Size
@@ -16,6 +73,11 @@ func (rs *RethinkStore) FindSize(id string) (*metal.Size, error) {
1673
return &s, nil
1774
}
1875

76+
// SearchSizes returns the result of the sizes search request query.
77+
func (rs *RethinkStore) SearchSizes(q *SizeSearchQuery, sizes *metal.Sizes) error {
78+
return rs.searchEntities(q.generateTerm(rs), sizes)
79+
}
80+
1981
// ListSizes returns all sizes.
2082
func (rs *RethinkStore) ListSizes() (metal.Sizes, error) {
2183
szs := make(metal.Sizes, 0)

0 commit comments

Comments
 (0)