| // Copyright 2018 Open Networking Foundation |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package main |
| |
| import ( |
| "encoding/json" |
| "fmt" |
| "net/http" |
| "bytes" |
| "regexp" |
| "strconv" |
| "time" |
| "os" |
| ) |
| |
| const REDFISH_PATH = "/redfish/v1/EventService/Subscriptions/" |
| const CONTENT_TYPE = "application/json" |
| |
| func add_subscription(ip string, event string) (rtn bool, id uint) { |
| rtn = false |
| id = 0 |
| |
| destip := os.Getenv("DEVICE_MANAGEMENT_DESTIP") + ":" + os.Getenv("DEVICE_MANAGEMENT_DESTPORT") |
| subscrpt_info := map[string]interface{}{"Context":"TBD","Protocol":"Redfish"} |
| subscrpt_info["Name"] = event + " event subscription" |
| subscrpt_info["Destination"] = "https://" + destip |
| subscrpt_info["EventTypes"] = []string{event} |
| sRequestJson, err := json.Marshal(subscrpt_info) |
| uri := ip + REDFISH_PATH |
| client := http.Client{Timeout: 10 * time.Second} |
| resp, err := client.Post(uri, CONTENT_TYPE, bytes.NewBuffer(sRequestJson)) |
| if err != nil { |
| fmt.Println(err) |
| return |
| } |
| defer resp.Body.Close() |
| |
| if resp.StatusCode != 201 { |
| result := make(map[string]interface{}) |
| json.NewDecoder(resp.Body).Decode(&result) |
| fmt.Println(result) |
| fmt.Println(result["data"]) |
| fmt.Println("Add ", event, " subscription failed. HTTP response status: ", resp.Status) |
| return |
| } |
| |
| rtn = true |
| loc := resp.Header["Location"] |
| re := regexp.MustCompile(`/(\w+)$`) |
| match := re.FindStringSubmatch(loc[0]) |
| idint, _ := strconv.Atoi(match[1]) |
| id = uint(idint) |
| fmt.Println("Subscription", event, "id", id, "was successfully added") |
| return |
| } |
| |
| func remove_subscription(ip string, id uint) bool { |
| uri := ip + REDFISH_PATH + strconv.Itoa(int(id)) |
| req, _ := http.NewRequest("DELETE", uri, nil) |
| resp, err := http.DefaultClient.Do(req) |
| if err != nil { |
| fmt.Println(err) |
| return false |
| } |
| defer resp.Body.Close() |
| |
| if code := resp.StatusCode; code < 200 && code > 299 { |
| result := make(map[string]interface{}) |
| json.NewDecoder(resp.Body).Decode(&result) |
| fmt.Println(result) |
| fmt.Println(result["data"]) |
| fmt.Println("Remove subscription failed. HTTP response status:", resp.Status) |
| return false |
| } |
| fmt.Println("Subscription id", id, "was successfully removed") |
| return true |
| } |
| |