mirror of
				https://github.com/luscis/openlan.git
				synced 2025-10-31 20:42:35 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			155 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
		
			Executable File
		
	
	
	
	
| package v6
 | |
| 
 | |
| import (
 | |
| 	"github.com/luscis/openlan/cmd/api"
 | |
| 	"github.com/luscis/openlan/pkg/database"
 | |
| 	"github.com/luscis/openlan/pkg/libol"
 | |
| 	"github.com/ovn-org/libovsdb/model"
 | |
| 	"github.com/ovn-org/libovsdb/ovsdb"
 | |
| 	"github.com/urfave/cli/v2"
 | |
| 	"sort"
 | |
| )
 | |
| 
 | |
| type Network struct {
 | |
| }
 | |
| 
 | |
| func (u Network) List(c *cli.Context) error {
 | |
| 	var listVn []database.VirtualNetwork
 | |
| 	err := database.Client.List(&listVn)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	sort.SliceStable(listVn, func(i, j int) bool {
 | |
| 		ii := listVn[i]
 | |
| 		jj := listVn[j]
 | |
| 		return ii.UUID > jj.UUID
 | |
| 	})
 | |
| 	return api.Out(listVn, c.String("format"), "")
 | |
| }
 | |
| 
 | |
| func (u Network) Add(c *cli.Context) error {
 | |
| 	name := c.String("name")
 | |
| 	if name == "" {
 | |
| 		return libol.NewErr("name is nil")
 | |
| 	}
 | |
| 	oldVn := database.VirtualNetwork{Name: name}
 | |
| 	if err := database.Client.Get(&oldVn); err == nil {
 | |
| 		return libol.NewErr("network %s already existed.", oldVn.Name)
 | |
| 	}
 | |
| 	address := c.String("address")
 | |
| 	provider := c.String("provider")
 | |
| 	newVn := database.VirtualNetwork{
 | |
| 		Name:     name,
 | |
| 		Address:  address,
 | |
| 		Bridge:   "br-" + name,
 | |
| 		UUID:     database.GenUUID(),
 | |
| 		Provider: provider,
 | |
| 	}
 | |
| 	ops, err := database.Client.Create(&newVn)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	libol.Debug("Network.Add %s", ops)
 | |
| 	database.Client.Execute(ops)
 | |
| 	sw, err := database.Client.Switch()
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	ops, err = database.Client.Where(sw).Mutate(sw, model.Mutation{
 | |
| 		Field:   &sw.VirtualNetworks,
 | |
| 		Mutator: ovsdb.MutateOperationInsert,
 | |
| 		Value:   []string{newVn.UUID},
 | |
| 	})
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	libol.Debug("Network.Add %s", ops)
 | |
| 	database.Client.Execute(ops)
 | |
| 	if ret, err := database.Client.Commit(); err != nil {
 | |
| 		return err
 | |
| 	} else {
 | |
| 		database.PrintError(ret)
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func (u Network) Remove(c *cli.Context) error {
 | |
| 	name := c.String("name")
 | |
| 	oldVn := database.VirtualNetwork{
 | |
| 		Name: name,
 | |
| 	}
 | |
| 	if err := database.Client.Get(&oldVn); err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	ops, err := database.Client.Where(&oldVn).Delete()
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	libol.Debug("Switch.Remove %s", ops)
 | |
| 	database.Client.Execute(ops)
 | |
| 	sw, err := database.Client.Switch()
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	ops, err = database.Client.Where(sw).Mutate(sw, model.Mutation{
 | |
| 		Field:   &sw.VirtualNetworks,
 | |
| 		Mutator: ovsdb.MutateOperationDelete,
 | |
| 		Value:   []string{oldVn.UUID},
 | |
| 	})
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	libol.Debug("Network.Remove %s", ops)
 | |
| 	database.Client.Execute(ops)
 | |
| 	if ret, err := database.Client.Commit(); err != nil {
 | |
| 		return err
 | |
| 	} else {
 | |
| 		database.PrintError(ret)
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func (u Network) Commands(app *api.App) {
 | |
| 	app.Command(&cli.Command{
 | |
| 		Name:    "network",
 | |
| 		Aliases: []string{"ne"},
 | |
| 		Usage:   "Virtual network",
 | |
| 		Subcommands: []*cli.Command{
 | |
| 			{
 | |
| 				Name:    "list",
 | |
| 				Usage:   "List virtual networks",
 | |
| 				Aliases: []string{"ls"},
 | |
| 				Action:  u.List,
 | |
| 			},
 | |
| 			{
 | |
| 				Name:  "add",
 | |
| 				Usage: "Add a virtual network",
 | |
| 				Flags: []cli.Flag{
 | |
| 					&cli.StringFlag{
 | |
| 						Name:  "name",
 | |
| 						Usage: "unique name with short long"},
 | |
| 					&cli.StringFlag{
 | |
| 						Name:  "provider",
 | |
| 						Value: "openlan",
 | |
| 						Usage: "provider name"},
 | |
| 					&cli.StringFlag{
 | |
| 						Name:  "address",
 | |
| 						Value: "169.255.169.0/24",
 | |
| 						Usage: "ip address"},
 | |
| 				},
 | |
| 				Action: u.Add,
 | |
| 			},
 | |
| 			{
 | |
| 				Name:  "del",
 | |
| 				Usage: "Del a virtual network",
 | |
| 				Flags: []cli.Flag{
 | |
| 					&cli.StringFlag{
 | |
| 						Name:  "name",
 | |
| 						Usage: "unique name with short long"},
 | |
| 				},
 | |
| 				Action: u.Remove,
 | |
| 			},
 | |
| 		},
 | |
| 	})
 | |
| }
 | 
