diff --git a/operator/deploy/controller/deployController.yaml b/operator/deploy/controller/deployController.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e229fc0d6fe4fe7880c7fbaa3c35519f962d74bb --- /dev/null +++ b/operator/deploy/controller/deployController.yaml @@ -0,0 +1,36 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: l2sm-controller-deployment +spec: + replicas: 1 + selector: + matchLabels: + app: l2sm-controller + template: + metadata: + labels: + app: l2sm-controller + spec: + containers: + - name: l2sm-controller + image: alexdecb/l2sm-controller:latest + ports: + - containerPort: 6633 + - containerPort: 8181 +--- +apiVersion: v1 +kind: Service +metadata: + name: l2sm-controller-service +spec: + selector: + app: l2sm-controller + ports: + - protocol: TCP + port: 6633 + targetPort: 6633 + - protocol: TCP + port: 8181 + targetPort: 8181 + type: ClusterIP diff --git a/operator/src/controller/Dockerfile b/operator/src/controller/Dockerfile deleted file mode 100644 index 18801b81f8778e043569c4e9138ddfc5ca6553e8..0000000000000000000000000000000000000000 --- a/operator/src/controller/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM onosproject/onos:2.7.0 - -COPY . ./ - -RUN chmod +x ./setup_controller.sh - -ENTRYPOINT ["./setup_controller.sh"] \ No newline at end of file diff --git a/operator/src/controller/api/go.mod b/operator/src/controller/api/go.mod new file mode 100644 index 0000000000000000000000000000000000000000..06106f30e1ee8ce2eb92f3b5b848c9d40c0cd12f --- /dev/null +++ b/operator/src/controller/api/go.mod @@ -0,0 +1,13 @@ +module l2sm_controller_api + +go 1.18 + +require ( + github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/helloyi/go-sshclient v1.2.0 // indirect + github.com/kr/fs v0.1.0 // indirect + github.com/pkg/sftp v1.13.5 // indirect + golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d // indirect + golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64 // indirect +) diff --git a/operator/src/controller/api/go.sum b/operator/src/controller/api/go.sum new file mode 100644 index 0000000000000000000000000000000000000000..2313e5b3f693e36ed96a7c81b1edc582d539f066 --- /dev/null +++ b/operator/src/controller/api/go.sum @@ -0,0 +1,44 @@ +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/helloyi/go-sshclient v1.2.0 h1:36YOcHjtb3QhtZPTFthb0kvDlfQqVHErwfObVq6omck= +github.com/helloyi/go-sshclient v1.2.0/go.mod h1:L2+lPFL4TshqEu5fl5FHqtojNDzUtPFIjHXgaZYMX0Q= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/pkg/sftp v1.13.5 h1:a3RLUqkyjYRtBTZJZ1VRrKbN3zhuPLlUc3sphVz81go= +github.com/pkg/sftp v1.13.5/go.mod h1:wHDZ0IZX6JcBYRK1TH9bcVq8G7TLpVHYIGJRFnmPfxg= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d h1:3qF+Z8Hkrw9sOhrFHti9TlB1Hkac1x+DNRkv0XQiFjo= +golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64 h1:UiNENfZ8gDvpiWw7IpOMQ27spWmThO1RwwdQVbJahJM= +golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/operator/src/controller/api/main.go b/operator/src/controller/api/main.go new file mode 100644 index 0000000000000000000000000000000000000000..ce76639a7904e3087b35bcea0b1c2f05ebce3faf --- /dev/null +++ b/operator/src/controller/api/main.go @@ -0,0 +1,119 @@ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "log" + "net/http" + + "golang.org/x/crypto/ssh" +) + +type Network struct { + Name string `json:"name"` + Ports []string `json:"ports"` +} + +func main() { + + //var hostKey ssh.PublicKey + // An SSH client is represented with a ClientConn. + // + // To authenticate with the remote server you must pass at least one + // implementation of AuthMethod via the Auth field in ClientConfig, + // and provide a HostKeyCallback. + config := &ssh.ClientConfig{ + User: "root", + Auth: []ssh.AuthMethod{ + ssh.Password("root123"), + }, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), + } + client, err := ssh.Dial("tcp", "172.17.0.2:22", config) + if err != nil { + log.Fatal("Failed to dial: ", err) + } + defer client.Close() + + // Each ClientConn can support multiple interactive sessions, + // represented by a Session. + session, err := client.NewSession() + if err != nil { + log.Fatal("Failed to create session: ", err) + } + defer session.Close() + + // Once a Session is created, you can execute a single command on + // the remote side using the Run method. + var b bytes.Buffer + session.Stdout = &b + if err := session.Run("/usr/bin/whoami"); err != nil { + log.Fatal("Failed to run: " + err.Error()) + } + fmt.Println(b.String()) + + http.HandleFunc("/network", func(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case "GET": + getNetwork(w, r) + case "POST": + createNetwork(w, r) + case "PUT": + updateNetwork(w, r) + default: + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + } + }) + + fmt.Println("Server is running on port 8080...") + http.ListenAndServe(":8080", nil) + +} + +func getNetwork(w http.ResponseWriter, r *http.Request) { + //var network Network + queryValues := r.URL.Query() + name := queryValues.Get("name") + //network = l2sm-get-network Name + + //json.NewEncoder(w).Encode(&network) + fmt.Printf("GET %s", name) +} + +func createNetwork(w http.ResponseWriter, r *http.Request) { + var network Network + if err := json.NewDecoder(r.Body).Decode(&network); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + //l2sm-create-network network.Name + w.WriteHeader(http.StatusCreated) + fmt.Printf("POST") + +} + +func updateNetwork(w http.ResponseWriter, r *http.Request) { + var network Network + + // l2sm-add-port network.Port + // if err := json.NewDecoder(r.Body).Decode(&network); err != nil { + // http.Error(w, err.Error(), http.StatusBadRequest) + // return + // } + // params := r.URL.Query() + // name := params.Get("name") + // port := params.Get("port") + + // for i, net := range networks { + // if net.Name == name { + // networks[i].Ports = append(networks[i].Ports, port) + // w.WriteHeader(http.StatusOK) + // return + // } + // } + + // http.Error(w, "Network not found", http.StatusNotFound) + fmt.Printf("UPDATE") + +} diff --git a/operator/src/controller/idco/Dockerfile b/operator/src/controller/idco/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..ab610527de746cf5b102f9be78fe6d106ddfacc9 --- /dev/null +++ b/operator/src/controller/idco/Dockerfile @@ -0,0 +1,9 @@ +FROM onosproject/onos:2.7.0 + +COPY . ./ + +RUN apt-get update && \ + apt-get install wget && \ + chmod +x ./setup_controller.sh + +ENTRYPOINT ["./setup_controller.sh"] \ No newline at end of file diff --git a/operator/src/controller/idco-app-1.0.oar b/operator/src/controller/idco/idco-app-1.0.oar similarity index 100% rename from operator/src/controller/idco-app-1.0.oar rename to operator/src/controller/idco/idco-app-1.0.oar diff --git a/operator/src/controller/setup_controller.sh b/operator/src/controller/idco/setup_controller.sh similarity index 50% rename from operator/src/controller/setup_controller.sh rename to operator/src/controller/idco/setup_controller.sh index c9f1a51242fe2aee9b6ba0cf46b2188e84ada5eb..d39ed1199c3b3feab28226e6d9d23752b6499d7d 100644 --- a/operator/src/controller/setup_controller.sh +++ b/operator/src/controller/idco/setup_controller.sh @@ -3,12 +3,25 @@ # turn on bash's job control set -m -# Start the primary process and put it in the background +# Start the onos server and put it on the background ./bin/onos-service server & -sleep 90 +sleep 10 -# Start the helper process +while true; do + response=$(wget --spider --server-response http://localhost:8181/onos/ui 2>&1) + status_codes=$(echo "$response" | awk '/HTTP\/1.1/{print $2}') + + if echo "$status_codes" | grep -q "200"; then + echo "Starting the configuration" + break + fi + + sleep 10 +done + + +# Start the configuration ./bin/onos-app localhost install idco-app-1.0.oar ./bin/onos-app localhost activate org.idco.app ./bin/onos-app localhost activate org.onosproject.drivers @@ -18,11 +31,5 @@ sleep 90 - - - - - -# now we bring the primary process back into the foreground -# and leave it there +# now we bring the server into the foreground fg %1 \ No newline at end of file