Bump xds-server to latest version
[src/xds/xds-agent.git] / lib / xaapiv1 / events.go
1 /*
2  * Copyright (C) 2017-2018 "IoT.bzh"
3  * Author Sebastien Douheret <sebastien@iot.bzh>
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *   http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 package xaapiv1
19
20 import (
21         "encoding/json"
22         "fmt"
23 )
24
25 // EventRegisterArgs is the parameters (json format) of /events/register command
26 type EventRegisterArgs struct {
27         Name      string `json:"name"`
28         ProjectID string `json:"filterProjectID"`
29 }
30
31 // EventUnRegisterArgs is the parameters (json format) of /events/unregister command
32 type EventUnRegisterArgs struct {
33         Name string `json:"name"`
34         ID   int    `json:"id"`
35 }
36
37 // Events Type definitions
38 const (
39         // EventTypePrefix Used as event prefix
40         EventTypePrefix = "event:" // following by event type
41
42         // Supported Events type
43         EVTAll = EventTypePrefix + "all"
44
45         EVTServerConfig  = EventTypePrefix + "server-config"        // type EventMsg with Data type xaapiv1.ServerCfg
46         EVTProjectAdd    = EventTypePrefix + "project-add"          // type EventMsg with Data type xaapiv1.ProjectConfig
47         EVTProjectDelete = EventTypePrefix + "project-delete"       // type EventMsg with Data type xaapiv1.ProjectConfig
48         EVTProjectChange = EventTypePrefix + "project-state-change" // type EventMsg with Data type xaapiv1.ProjectConfig
49
50         EVTSDKAdd         = EventTypePrefix + "sdk-add"          // type EventMsg with Data type xaapiv1.SDK
51         EVTSDKRemove      = EventTypePrefix + "sdk-remove"       // type EventMsg with Data type xaapiv1.SDK
52         EVTSDKManagement  = EventTypePrefix + "sdk-management"   // type EventMsg with Data type xaapiv1.SDKManagementMsg
53         EVTSDKStateChange = EventTypePrefix + "sdk-state-change" // type EventMsg with Data type xaapiv1.SDK
54
55         EVTTargetAdd         = EventTypePrefix + "target-add"          // type EventMsg with Data type xaapiv1.TargetConfig
56         EVTTargetRemove      = EventTypePrefix + "target-remove"       // type EventMsg with Data type xaapiv1.TargetConfig
57         EVTTargetStateChange = EventTypePrefix + "target-state-change" // type EventMsg with Data type xaapiv1.TargetConfig
58
59         EVTTargetTerminalAdd         = EventTypePrefix + "target-terminal-add"          // type EventMsg with Data type xaapiv1.TerminalConfig
60         EVTTargetTerminalRemove      = EventTypePrefix + "target-terminal-remove"       // type EventMsg with Data type xaapiv1.TerminalConfig
61         EVTTargetTerminalStateChange = EventTypePrefix + "target-terminal-state-change" // type EventMsg with Data type xaapiv1.TerminalConfig
62 )
63
64 // EVTAllList List of all supported events
65 var EVTAllList = []string{
66         EVTServerConfig,
67         EVTProjectAdd,
68         EVTProjectDelete,
69         EVTProjectChange,
70         EVTSDKAdd,
71         EVTSDKRemove,
72         EVTSDKManagement,
73         EVTSDKStateChange,
74         EVTTargetAdd,
75         EVTTargetRemove,
76         EVTTargetStateChange,
77         EVTTargetTerminalAdd,
78         EVTTargetTerminalRemove,
79         EVTTargetTerminalStateChange,
80 }
81
82 // EventMsg Event message send over Websocket, data format depend to Type (see DecodeXXX function)
83 type EventMsg struct {
84         Time          string      `json:"time"`      // Timestamp
85         FromSessionID string      `json:"sessionID"` // Session ID of client who produce this event
86         Type          string      `json:"type"`      // Data type
87         Data          interface{} `json:"data"`      // Data
88 }
89
90 // DecodeServerCfg Helper to decode Data field type ServerCfg
91 func (e *EventMsg) DecodeServerCfg() (ServerCfg, error) {
92         p := ServerCfg{}
93         if e.Type != EVTServerConfig {
94                 return p, fmt.Errorf("Invalid type")
95         }
96         d, err := json.Marshal(e.Data)
97         if err == nil {
98                 err = json.Unmarshal(d, &p)
99         }
100         return p, err
101 }
102
103 // DecodeProjectConfig Helper to decode Data field type ProjectConfig
104 func (e *EventMsg) DecodeProjectConfig() (ProjectConfig, error) {
105         var err error
106         p := ProjectConfig{}
107         switch e.Type {
108         case EVTProjectAdd, EVTProjectChange, EVTProjectDelete:
109                 d := []byte{}
110                 d, err = json.Marshal(e.Data)
111                 if err == nil {
112                         err = json.Unmarshal(d, &p)
113                 }
114         default:
115                 err = fmt.Errorf("Invalid type")
116         }
117         return p, err
118 }
119
120 // DecodeSDKMgtMsg Helper to decode Data field type SDKManagementMsg
121 func (e *EventMsg) DecodeSDKMgtMsg() (SDKManagementMsg, error) {
122         var err error
123         s := SDKManagementMsg{}
124         if e.Type != EVTSDKManagement {
125                 return s, fmt.Errorf("Invalid type")
126         }
127         d := []byte{}
128         d, err = json.Marshal(e.Data)
129         if err == nil {
130                 err = json.Unmarshal(d, &s)
131         }
132         return s, err
133 }
134
135 // DecodeSDKEvent Helper to decode Data field type SDK
136 func (e *EventMsg) DecodeSDKEvent() (SDK, error) {
137         var err error
138         s := SDK{}
139         switch e.Type {
140         case EVTSDKAdd, EVTSDKRemove, EVTSDKStateChange:
141                 d := []byte{}
142                 d, err = json.Marshal(e.Data)
143                 if err == nil {
144                         err = json.Unmarshal(d, &s)
145                 }
146         default:
147                 err = fmt.Errorf("Invalid type")
148         }
149         return s, err
150 }
151
152 // DecodeTargetEvent Helper to decode Data field type TargetConfig
153 func (e *EventMsg) DecodeTargetEvent() (TargetConfig, error) {
154         var err error
155         p := TargetConfig{}
156         switch e.Type {
157         case EVTTargetAdd, EVTTargetRemove, EVTTargetStateChange:
158                 d := []byte{}
159                 d, err = json.Marshal(e.Data)
160                 if err == nil {
161                         err = json.Unmarshal(d, &p)
162                 }
163         default:
164                 err = fmt.Errorf("Invalid type")
165         }
166         return p, err
167 }
168
169 // DecodeTerminalEvent Helper to decode Data field type TerminalConfig
170 func (e *EventMsg) DecodeTerminalEvent() (TerminalConfig, error) {
171         var err error
172         p := TerminalConfig{}
173         switch e.Type {
174         case EVTTargetTerminalAdd, EVTTargetTerminalRemove, EVTTargetTerminalStateChange:
175                 d := []byte{}
176                 d, err = json.Marshal(e.Data)
177                 if err == nil {
178                         err = json.Unmarshal(d, &p)
179                 }
180         default:
181                 err = fmt.Errorf("Invalid type")
182         }
183         return p, err
184 }