Skip to content

Commit f9941d8

Browse files
committed
endpointGroup inspect support
1 parent aff7a9a commit f9941d8

File tree

6 files changed

+175
-11
lines changed

6 files changed

+175
-11
lines changed

Makefile

+3-3
Original file line numberDiff line numberDiff line change
@@ -203,9 +203,9 @@ host-unit-test-coverage-detail:
203203

204204
host-integ-test: host-cleanup
205205
@echo dev: running integration tests...
206-
sudo -E /usr/local/go/bin/go test -v ./test/integration/ -check.vv -encap vlan -fwd-mode bridge
207-
sudo -E /usr/local/go/bin/go test -v ./test/integration/ -check.vv -encap vxlan -fwd-mode bridge
208-
sudo -E /usr/local/go/bin/go test -v ./test/integration/ -check.vv -encap vxlan -fwd-mode routing
206+
sudo -E /usr/local/go/bin/go test -v ./test/integration/ -check.v -encap vlan -fwd-mode bridge
207+
sudo -E /usr/local/go/bin/go test -v ./test/integration/ -check.v -encap vxlan -fwd-mode bridge
208+
sudo -E /usr/local/go/bin/go test -v ./test/integration/ -check.v -encap vxlan -fwd-mode routing
209209

210210
host-cleanup:
211211
@echo dev: cleaning up services...

netctl/commands.go

+7
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ var Commands = []cli.Command{
6666
},
6767
Action: createEndpointGroup,
6868
},
69+
{
70+
Name: "inspect",
71+
Usage: "Inspect a EndpointGroup",
72+
ArgsUsage: "[group]",
73+
Flags: []cli.Flag{tenantFlag, jsonFlag},
74+
Action: inspectEndpointGroup,
75+
},
6976
{
7077
Name: "rm",
7178
Aliases: []string{"delete"},

netctl/netctl.go

+16
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,22 @@ func createEndpointGroup(ctx *cli.Context) {
580580
fmt.Printf("Creating EndpointGroup %s:%s\n", tenant, group)
581581
}
582582

583+
func inspectEndpointGroup(ctx *cli.Context) {
584+
argCheck(1, ctx)
585+
586+
tenant := ctx.String("tenant")
587+
endpointGroup := ctx.Args()[0]
588+
589+
fmt.Printf("Inspeting endpointGroup: %s tenant: %s\n", endpointGroup, tenant)
590+
591+
epg, err := getClient(ctx).EndpointGroupInspect(tenant, endpointGroup)
592+
errCheck(ctx, err)
593+
594+
content, err := json.MarshalIndent(epg, "", " ")
595+
os.Stdout.Write(content)
596+
os.Stdout.WriteString("\n")
597+
}
598+
583599
func deleteEndpointGroup(ctx *cli.Context) {
584600
argCheck(1, ctx)
585601

netmaster/objApi/apiController.go

+53-7
Original file line numberDiff line numberDiff line change
@@ -803,7 +803,58 @@ func (ac *APIController) EndpointGroupUpdate(endpointGroup, params *contivModel.
803803
return nil
804804
}
805805

806-
// EndpointGroupDelete deletes endpoint group
806+
// EndpointGroupGetOper inspects endpointGroup
807+
func (ac *APIController) EndpointGroupGetOper(endpointGroup *contivModel.EndpointGroupInspect) error {
808+
log.Infof("Received EndpointGroupInspect: %+v", endpointGroup)
809+
810+
// Get the state driver
811+
stateDriver, err := utils.GetStateDriver()
812+
if err != nil {
813+
return err
814+
}
815+
816+
epgCfg := &mastercfg.EndpointGroupState{}
817+
epgCfg.StateDriver = stateDriver
818+
epgID := endpointGroup.Config.GroupName + ":" + endpointGroup.Config.TenantName
819+
if err := epgCfg.Read(epgID); err != nil {
820+
log.Errorf("Error fetching endpointGroup from mastercfg: %s", epgID)
821+
return err
822+
}
823+
824+
endpointGroup.Oper.ExternalPktTag = epgCfg.ExtPktTag
825+
endpointGroup.Oper.PktTag = epgCfg.PktTag
826+
endpointGroup.Oper.NumEndpoints = epgCfg.EpCount
827+
828+
readEp := &mastercfg.CfgEndpointState{}
829+
readEp.StateDriver = stateDriver
830+
epCfgs, err := readEp.ReadAll()
831+
if err == nil {
832+
for _, epCfg := range epCfgs {
833+
ep := epCfg.(*mastercfg.CfgEndpointState)
834+
if ep.EndpointGroupKey == epgID {
835+
epOper := contivModel.EndpointOper{}
836+
epOper.Network = ep.NetID
837+
epOper.EndpointID = ep.EndpointID
838+
epOper.ServiceName = ep.ServiceName
839+
epOper.EndpointGroupID = ep.EndpointGroupID
840+
epOper.EndpointGroupKey = ep.EndpointGroupKey
841+
epOper.IpAddress = []string{ep.IPAddress, ep.IPv6Address}
842+
epOper.MacAddress = ep.MacAddress
843+
epOper.HomingHost = ep.HomingHost
844+
epOper.IntfName = ep.IntfName
845+
epOper.VtepIP = ep.VtepIP
846+
epOper.Labels = fmt.Sprintf("%s", ep.Labels)
847+
epOper.ContainerID = ep.ContainerID
848+
epOper.ContainerName = ep.ContainerName
849+
endpointGroup.Oper.Endpoints = append(endpointGroup.Oper.Endpoints, epOper)
850+
}
851+
}
852+
}
853+
854+
return nil
855+
}
856+
857+
// EndpointGroupDelete deletes end point group
807858
func (ac *APIController) EndpointGroupDelete(endpointGroup *contivModel.EndpointGroup) error {
808859
log.Infof("Received EndpointGroupDelete: %+v", endpointGroup)
809860

@@ -917,7 +968,7 @@ func (ac *APIController) NetworkCreate(network *contivModel.Network) error {
917968
return nil
918969
}
919970

920-
// NetworkGetOper updates network
971+
// NetworkGetOper inspects network
921972
func (ac *APIController) NetworkGetOper(network *contivModel.NetworkInspect) error {
922973
log.Infof("Received NetworkInspect: %+v", network)
923974

@@ -1749,8 +1800,3 @@ func validatePorts(ports []string) bool {
17491800
}
17501801
return true
17511802
}
1752-
1753-
// EndpointGroupGetOper returns nil
1754-
func (ac *APIController) EndpointGroupGetOper(endpointGroup *contivModel.EndpointGroupInspect) error {
1755-
return nil
1756-
}

test/integration/endpoint_test.go

+89
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,92 @@ func (its *integTestSuite) TestEndpointGroupCreateDelete(c *C) {
213213

214214
assertNoErr(its.client.NetworkDelete("default", "test"), c, "deleting network")
215215
}
216+
217+
// TestEndpointGroupInspect test endpointGroup inspect command
218+
func (its *integTestSuite) TestEndpointGroupInspect(c *C) {
219+
// Create a network
220+
err := its.client.NetworkPost(&client.Network{
221+
TenantName: "default",
222+
NetworkName: "test",
223+
Subnet: "10.1.1.0/24",
224+
Encap: its.encap,
225+
})
226+
assertNoErr(err, c, "creating network")
227+
228+
// Create a epg
229+
err = its.client.EndpointGroupPost(&client.EndpointGroup{
230+
TenantName: "default",
231+
NetworkName: "test",
232+
GroupName: "epgA",
233+
})
234+
assertNoErr(err, c, "creating endpointgroup")
235+
236+
// verify endpointGroup state is correct
237+
insp, err := its.client.EndpointGroupInspect("default", "epgA")
238+
assertNoErr(err, c, "inspecting endpointGroup")
239+
log.Infof("Inspecting endpointGroup: %+v", insp)
240+
c.Assert(len(insp.Oper.Endpoints), Equals, 0)
241+
c.Assert(insp.Oper.PktTag, Equals, 1)
242+
c.Assert(insp.Oper.NumEndpoints, Equals, 0)
243+
244+
for i := 0; i < its.iterations; i++ {
245+
addr, err := its.allocAddress("", "test.default", "")
246+
assertNoErr(err, c, "allocating address")
247+
c.Assert(addr, Equals, "10.1.1.1")
248+
249+
// create an endpoint in epg
250+
epCfg1, err := its.createEndpoint("default", "test", "epgA", addr, "")
251+
assertNoErr(err, c, "creating endpoint")
252+
253+
// verify endpointGroup & endpoint inspect output
254+
insp, err := its.client.EndpointGroupInspect("default", "epgA")
255+
assertNoErr(err, c, "inspecting endpointGroup")
256+
log.Infof("Inspecting endpointGroup: %+v", insp)
257+
c.Assert(len(insp.Oper.Endpoints), Equals, 1)
258+
c.Assert(insp.Oper.NumEndpoints, Equals, 1)
259+
260+
// verify the endpoint inspect and flow
261+
its.verifyEndpointInspect("default", "test", epCfg1, c)
262+
its.verifyEndpointFlow(epCfg1, c)
263+
264+
// allocate a specific address
265+
addr, err = its.allocAddress("", "test.default", "10.1.1.5")
266+
assertNoErr(err, c, "allocating address")
267+
c.Assert(addr, Equals, "10.1.1.5")
268+
269+
// create an endpoint in epg
270+
epCfg2, err := its.createEndpoint("default", "test", "epgA", addr, "")
271+
assertNoErr(err, c, "creating endpoint")
272+
273+
// verify network & endpoint inspect output
274+
insp, err = its.client.EndpointGroupInspect("default", "epgA")
275+
assertNoErr(err, c, "inspecting endpointGroup")
276+
log.Infof("Inspecting endpointGroup: %+v", insp)
277+
c.Assert(len(insp.Oper.Endpoints), Equals, 2)
278+
c.Assert(insp.Oper.NumEndpoints, Equals, 2)
279+
280+
// verify endpoint inspect and flows is added
281+
its.verifyEndpointInspect("default", "test", epCfg2, c)
282+
its.verifyEndpointFlow(epCfg2, c)
283+
284+
// delete the endpoints
285+
err = its.deleteEndpoint("default", "test", "", epCfg1)
286+
assertNoErr(err, c, "deleting endpoint")
287+
err = its.deleteEndpoint("default", "test", "", epCfg2)
288+
assertNoErr(err, c, "deleting endpoint")
289+
290+
// verify there are no more endpoints in epg
291+
insp, err = its.client.EndpointGroupInspect("default", "epgA")
292+
assertNoErr(err, c, "inspecting endpointGroup")
293+
c.Assert(len(insp.Oper.Endpoints), Equals, 0)
294+
log.Infof("Inspecting endpointGroup: %+v", insp)
295+
c.Assert(len(insp.Oper.Endpoints), Equals, 0)
296+
c.Assert(insp.Oper.NumEndpoints, Equals, 0)
297+
298+
// verify flows are also gone
299+
its.verifyEndpointFlowRemoved(epCfg1, c)
300+
its.verifyEndpointFlowRemoved(epCfg2, c)
301+
}
302+
303+
assertNoErr(its.client.EndpointGroupDelete("default", "epgA"), c, "deleting endpointGroup")
304+
}

test/integration/utils_test.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,13 @@ func (its *integTestSuite) verifyEndpointFlow(epCfg *mastercfg.CfgEndpointState,
294294
assertNoErr(err, c, "dumping flow entries")
295295

296296
// verify dst group entry exists
297-
dstGrpFmt := fmt.Sprintf("nw_dst=%s actions=write_metadata:%d/0xfffe", epCfg.IPAddress, epCfg.EndpointGroupID)
297+
var dstGrpFmt string
298+
if epCfg.EndpointGroupID == 0 {
299+
dstGrpFmt = fmt.Sprintf("nw_dst=%s actions=write_metadata:0/0xfffe", epCfg.IPAddress)
300+
} else {
301+
dstGrpFmt = fmt.Sprintf("nw_dst=%s actions=write_metadata:0x%x/0xfffe", epCfg.IPAddress, (epCfg.EndpointGroupID << 1))
302+
}
303+
298304
dstGrpTbl := ofnet.DST_GRP_TBL_ID
299305
c.Assert(ofctlFlowMatch(ofdump, dstGrpTbl, dstGrpFmt), Equals, true)
300306

0 commit comments

Comments
 (0)