func createBridge(ovs *libovsdb.OvsdbClient, bridgeName string) { namedUuid := "gopher" // bridge row to insert bridge := make(map[string]interface{}) bridge["name"] = bridgeName // simple insert operation insertOp := libovsdb.Operation{ Op: "insert", Table: "Bridge", Row: bridge, UUIDName: namedUuid, } // Inserting a Bridge row in Bridge table requires mutating the open_vswitch table. mutateUuid := []libovsdb.UUID{libovsdb.UUID{namedUuid}} mutateSet, _ := libovsdb.NewOvsSet(mutateUuid) mutation := libovsdb.NewMutation("bridges", "insert", mutateSet) condition := libovsdb.NewCondition("_uuid", "==", libovsdb.UUID{getRootUuid()}) // simple mutate operation mutateOp := libovsdb.Operation{ Op: "mutate", Table: "Open_vSwitch", Mutations: []interface{}{mutation}, Where: []interface{}{condition}, } operations := []libovsdb.Operation{insertOp, mutateOp} reply, _ := ovs.Transact("Open_vSwitch", operations...) if len(reply) < len(operations) { fmt.Println("Number of Replies should be atleast equal to number of Operations") } ok := true for i, o := range reply { if o.Error != "" && i < len(operations) { fmt.Println("Transaction Failed due to an error :", o.Error, " details:", o.Details, " in ", operations[i]) ok = false } else if o.Error != "" { fmt.Println("Transaction Failed due to an error :", o.Error) ok = false } } if ok { fmt.Println("Bridge Addition Successful : ", reply[0].UUID.GoUuid) } }
// load a set of columns of a table func LoadTable(ovs *libovsdb.OvsdbClient, database string, table string, columns []string) *Database { db := Database{database, make(map[string]Table)} schema, _ := ovs.Schema[database] requests := make(map[string]libovsdb.MonitorRequest) tableSchema := schema.Tables[table] if len(columns) == 0 { for column := range tableSchema.Columns { columns = append(columns, column) } } requests[table] = libovsdb.MonitorRequest{ Columns: columns, Select: libovsdb.MonitorSelect{ Initial: true, Insert: true, Delete: true, Modify: true}} initial, _ := ovs.Monitor(database, "", requests) populateDatabase(initial, &db) return &db }
func play(ovs *libovsdb.OvsdbClient) { go processInput(ovs) for { select { case currUpdate := <-update: for table, tableUpdate := range currUpdate.Updates { if table == "Bridge" { for uuid, row := range tableUpdate.Rows { newRow := row.New if _, ok := newRow.Fields["name"]; ok { name := newRow.Fields["name"].(string) if name == "stop" { fmt.Println("Bridge stop detected : ", uuid) ovs.Disconnect() quit <- true } } } } } } } }
// load all tables func LoadAll(ovs *libovsdb.OvsdbClient, database string) *Database { db := Database{database, make(map[string]Table)} initial, _ := ovs.MonitorAll(database, "") populateDatabase(initial, &db) return &db }