diff --git a/.gitbook/assets/Screen Shot 2021-07-28 at 4.40.17 PM.png b/.gitbook/assets/Screen Shot 2021-07-28 at 4.40.17 PM.png new file mode 100644 index 0000000..400de28 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-28 at 4.40.17 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-28 at 4.54.43 PM.png b/.gitbook/assets/Screen Shot 2021-07-28 at 4.54.43 PM.png new file mode 100644 index 0000000..e2c564f Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-28 at 4.54.43 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-28 at 5.15.03 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-28 at 5.15.03 PM (1).png new file mode 100644 index 0000000..a76aeb9 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-28 at 5.15.03 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-28 at 5.15.03 PM.png b/.gitbook/assets/Screen Shot 2021-07-28 at 5.15.03 PM.png new file mode 100644 index 0000000..a76aeb9 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-28 at 5.15.03 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-28 at 5.17.59 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-28 at 5.17.59 PM (1).png new file mode 100644 index 0000000..67c619f Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-28 at 5.17.59 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-28 at 5.17.59 PM.png b/.gitbook/assets/Screen Shot 2021-07-28 at 5.17.59 PM.png new file mode 100644 index 0000000..67c619f Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-28 at 5.17.59 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-28 at 5.21.07 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-28 at 5.21.07 PM (1).png new file mode 100644 index 0000000..a152fce Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-28 at 5.21.07 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-28 at 5.21.07 PM.png b/.gitbook/assets/Screen Shot 2021-07-28 at 5.21.07 PM.png new file mode 100644 index 0000000..a152fce Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-28 at 5.21.07 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-28 at 5.24.00 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-28 at 5.24.00 PM (1).png new file mode 100644 index 0000000..35457c9 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-28 at 5.24.00 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-28 at 5.24.00 PM.png b/.gitbook/assets/Screen Shot 2021-07-28 at 5.24.00 PM.png new file mode 100644 index 0000000..35457c9 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-28 at 5.24.00 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-28 at 5.25.29 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-28 at 5.25.29 PM (1).png new file mode 100644 index 0000000..cd783bd Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-28 at 5.25.29 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-28 at 5.25.29 PM.png b/.gitbook/assets/Screen Shot 2021-07-28 at 5.25.29 PM.png new file mode 100644 index 0000000..cd783bd Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-28 at 5.25.29 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-28 at 5.25.50 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-28 at 5.25.50 PM (1).png new file mode 100644 index 0000000..b4d612b Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-28 at 5.25.50 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-28 at 5.25.50 PM.png b/.gitbook/assets/Screen Shot 2021-07-28 at 5.25.50 PM.png new file mode 100644 index 0000000..b4d612b Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-28 at 5.25.50 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.25.03 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.25.03 PM (1).png new file mode 100644 index 0000000..9a2ca7c Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.25.03 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.25.03 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.25.03 PM.png new file mode 100644 index 0000000..9a2ca7c Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.25.03 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.28.44 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.28.44 PM (1).png new file mode 100644 index 0000000..f6ef379 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.28.44 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.28.44 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.28.44 PM.png new file mode 100644 index 0000000..f6ef379 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.28.44 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.31.03 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.31.03 PM (1).png new file mode 100644 index 0000000..6c90d14 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.31.03 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.31.03 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.31.03 PM.png new file mode 100644 index 0000000..6c90d14 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.31.03 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.33.58 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.33.58 PM (1).png new file mode 100644 index 0000000..4764c88 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.33.58 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.33.58 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.33.58 PM.png new file mode 100644 index 0000000..4764c88 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.33.58 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.35.48 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.35.48 PM (1).png new file mode 100644 index 0000000..a69fe44 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.35.48 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.35.48 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.35.48 PM.png new file mode 100644 index 0000000..a69fe44 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.35.48 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.37.30 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.37.30 PM (1).png new file mode 100644 index 0000000..f34e594 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.37.30 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.37.30 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.37.30 PM.png new file mode 100644 index 0000000..f34e594 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.37.30 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.39.24 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.39.24 PM (1).png new file mode 100644 index 0000000..b5e1f72 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.39.24 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.39.24 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.39.24 PM.png new file mode 100644 index 0000000..b5e1f72 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.39.24 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.46.29 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.46.29 PM (1).png new file mode 100644 index 0000000..76a702c Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.46.29 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.46.29 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.46.29 PM.png new file mode 100644 index 0000000..76a702c Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.46.29 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.48.31 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.48.31 PM (1).png new file mode 100644 index 0000000..e1ed60e Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.48.31 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.48.31 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.48.31 PM.png new file mode 100644 index 0000000..e1ed60e Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.48.31 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.52.10 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.52.10 PM.png new file mode 100644 index 0000000..82e3daa Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.52.10 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.53.14 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.53.14 PM.png new file mode 100644 index 0000000..905c682 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.53.14 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 2.57.34 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 2.57.34 PM.png new file mode 100644 index 0000000..cfc7561 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 2.57.34 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 3.04.42 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 3.04.42 PM.png new file mode 100644 index 0000000..df9590c Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 3.04.42 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 3.06.20 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 3.06.20 PM.png new file mode 100644 index 0000000..0d56120 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 3.06.20 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 3.10.22 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 3.10.22 PM.png new file mode 100644 index 0000000..a582cb5 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 3.10.22 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 3.12.02 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 3.12.02 PM.png new file mode 100644 index 0000000..6edc5ee Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 3.12.02 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 3.12.27 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 3.12.27 PM.png new file mode 100644 index 0000000..98754f2 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 3.12.27 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 3.16.52 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 3.16.52 PM.png new file mode 100644 index 0000000..fbd9afb Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 3.16.52 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 3.18.12 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 3.18.12 PM.png new file mode 100644 index 0000000..6292c51 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 3.18.12 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 3.21.37 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 3.21.37 PM.png new file mode 100644 index 0000000..7a6c07d Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 3.21.37 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 3.26.35 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 3.26.35 PM.png new file mode 100644 index 0000000..e058d1a Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 3.26.35 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 4.43.57 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 4.43.57 PM.png new file mode 100644 index 0000000..d5bfe3f Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 4.43.57 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 4.46.01 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 4.46.01 PM.png new file mode 100644 index 0000000..21728cb Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 4.46.01 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.04.23 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.04.23 PM (1).png new file mode 100644 index 0000000..57dc9da Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.04.23 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.04.23 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.04.23 PM.png new file mode 100644 index 0000000..57dc9da Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.04.23 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.06.35 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.06.35 PM (1).png new file mode 100644 index 0000000..d55a056 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.06.35 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.06.35 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.06.35 PM.png new file mode 100644 index 0000000..d55a056 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.06.35 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.07.50 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.07.50 PM (1).png new file mode 100644 index 0000000..a78783c Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.07.50 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.07.50 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.07.50 PM.png new file mode 100644 index 0000000..a78783c Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.07.50 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.09.14 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.09.14 PM (1).png new file mode 100644 index 0000000..e7f04fb Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.09.14 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.09.14 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.09.14 PM.png new file mode 100644 index 0000000..e7f04fb Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.09.14 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.11.05 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.11.05 PM (1).png new file mode 100644 index 0000000..a4e87fd Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.11.05 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.11.05 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.11.05 PM.png new file mode 100644 index 0000000..a4e87fd Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.11.05 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.12.39 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.12.39 PM (1).png new file mode 100644 index 0000000..921f7d8 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.12.39 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.12.39 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.12.39 PM.png new file mode 100644 index 0000000..921f7d8 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.12.39 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.13.40 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.13.40 PM (1).png new file mode 100644 index 0000000..7b21946 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.13.40 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.13.40 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.13.40 PM.png new file mode 100644 index 0000000..7b21946 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.13.40 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.16.01 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.16.01 PM (1).png new file mode 100644 index 0000000..c7ac63a Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.16.01 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.16.01 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.16.01 PM.png new file mode 100644 index 0000000..c7ac63a Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.16.01 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.17.13 PM (1).png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.17.13 PM (1).png new file mode 100644 index 0000000..7a2bec3 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.17.13 PM (1).png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-29 at 5.17.13 PM.png b/.gitbook/assets/Screen Shot 2021-07-29 at 5.17.13 PM.png new file mode 100644 index 0000000..7a2bec3 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-29 at 5.17.13 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-07-30 at 12.09.27 AM.png b/.gitbook/assets/Screen Shot 2021-07-30 at 12.09.27 AM.png new file mode 100644 index 0000000..2fbfcc9 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-07-30 at 12.09.27 AM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-08-01 at 12.04.01 PM.png b/.gitbook/assets/Screen Shot 2021-08-01 at 12.04.01 PM.png new file mode 100644 index 0000000..3f8f512 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-08-01 at 12.04.01 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-08-01 at 12.04.36 PM.png b/.gitbook/assets/Screen Shot 2021-08-01 at 12.04.36 PM.png new file mode 100644 index 0000000..40547e9 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-08-01 at 12.04.36 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-08-01 at 12.06.15 PM.png b/.gitbook/assets/Screen Shot 2021-08-01 at 12.06.15 PM.png new file mode 100644 index 0000000..6e0d020 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-08-01 at 12.06.15 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-08-01 at 12.07.27 PM.png b/.gitbook/assets/Screen Shot 2021-08-01 at 12.07.27 PM.png new file mode 100644 index 0000000..35855ea Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-08-01 at 12.07.27 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-08-01 at 12.08.45 PM.png b/.gitbook/assets/Screen Shot 2021-08-01 at 12.08.45 PM.png new file mode 100644 index 0000000..9a3bcf8 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-08-01 at 12.08.45 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2021-12-08 at 2.14.02 PM.png b/.gitbook/assets/Screen Shot 2021-12-08 at 2.14.02 PM.png new file mode 100644 index 0000000..3385675 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2021-12-08 at 2.14.02 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-19 at 2.36.39 PM.png b/.gitbook/assets/Screen Shot 2022-07-19 at 2.36.39 PM.png new file mode 100644 index 0000000..15dc58c Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-19 at 2.36.39 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-19 at 2.39.45 PM.png b/.gitbook/assets/Screen Shot 2022-07-19 at 2.39.45 PM.png new file mode 100644 index 0000000..6ae5e37 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-19 at 2.39.45 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-19 at 2.42.29 PM.png b/.gitbook/assets/Screen Shot 2022-07-19 at 2.42.29 PM.png new file mode 100644 index 0000000..7173688 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-19 at 2.42.29 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-19 at 2.44.19 PM.png b/.gitbook/assets/Screen Shot 2022-07-19 at 2.44.19 PM.png new file mode 100644 index 0000000..291943f Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-19 at 2.44.19 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-19 at 3.00.27 PM.png b/.gitbook/assets/Screen Shot 2022-07-19 at 3.00.27 PM.png new file mode 100644 index 0000000..0b0f90c Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-19 at 3.00.27 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 1.07.24 PM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 1.07.24 PM.png new file mode 100644 index 0000000..7995d55 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 1.07.24 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 1.21.43 PM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 1.21.43 PM.png new file mode 100644 index 0000000..1f2b9c4 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 1.21.43 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 1.24.18 PM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 1.24.18 PM.png new file mode 100644 index 0000000..dfa78f8 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 1.24.18 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 1.25.43 PM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 1.25.43 PM.png new file mode 100644 index 0000000..f1e577c Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 1.25.43 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 1.29.54 PM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 1.29.54 PM.png new file mode 100644 index 0000000..76dc330 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 1.29.54 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 1.37.02 PM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 1.37.02 PM.png new file mode 100644 index 0000000..80f3334 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 1.37.02 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 1.38.22 PM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 1.38.22 PM.png new file mode 100644 index 0000000..d0f0851 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 1.38.22 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 11.17.24 AM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 11.17.24 AM.png new file mode 100644 index 0000000..73ff5c6 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 11.17.24 AM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 11.17.56 AM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 11.17.56 AM.png new file mode 100644 index 0000000..9c6b394 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 11.17.56 AM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 11.27.42 AM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 11.27.42 AM.png new file mode 100644 index 0000000..ecbdf4c Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 11.27.42 AM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 11.28.28 AM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 11.28.28 AM.png new file mode 100644 index 0000000..9eefac6 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 11.28.28 AM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 11.34.02 AM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 11.34.02 AM.png new file mode 100644 index 0000000..c5badf6 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 11.34.02 AM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 11.36.08 AM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 11.36.08 AM.png new file mode 100644 index 0000000..3909ebd Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 11.36.08 AM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 11.37.22 AM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 11.37.22 AM.png new file mode 100644 index 0000000..2384cd8 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 11.37.22 AM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 11.38.58 AM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 11.38.58 AM.png new file mode 100644 index 0000000..91850a0 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 11.38.58 AM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 11.40.03 AM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 11.40.03 AM.png new file mode 100644 index 0000000..6cb8c76 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 11.40.03 AM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 11.48.24 AM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 11.48.24 AM.png new file mode 100644 index 0000000..15092c0 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 11.48.24 AM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 12.01.11 PM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 12.01.11 PM.png new file mode 100644 index 0000000..09ee18c Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 12.01.11 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 12.03.23 PM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 12.03.23 PM.png new file mode 100644 index 0000000..4a548b8 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 12.03.23 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 12.04.00 PM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 12.04.00 PM.png new file mode 100644 index 0000000..0b188c6 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 12.04.00 PM.png differ diff --git a/.gitbook/assets/Screen Shot 2022-07-20 at 4.54.58 PM.png b/.gitbook/assets/Screen Shot 2022-07-20 at 4.54.58 PM.png new file mode 100644 index 0000000..3b4fb13 Binary files /dev/null and b/.gitbook/assets/Screen Shot 2022-07-20 at 4.54.58 PM.png differ diff --git a/.gitbook/assets/SimpleConfig_OpenWiFidocs.json b/.gitbook/assets/SimpleConfig_OpenWiFidocs.json new file mode 100644 index 0000000..629f71c --- /dev/null +++ b/.gitbook/assets/SimpleConfig_OpenWiFidocs.json @@ -0,0 +1,113 @@ +{ + "uuid": 2, + "unit": { + "location": "TIP Lab Network", + "timezone": "EST+5EDT,M3.2.0/2,M11.1.0/2" + }, + "radios": [ + { + "band": "5G", + "country": "CA", + "channel": "auto", + "channel-mode": "HE", + "channel-width": 80, + "require-mode": "HT", + "rates": { + "beacon": 6000, + "multicast": 24000 + } + }, + { + "band": "2G", + "country": "CA", + "channel": 11, + "channel-mode": "HE", + "channel-width": 80, + "require-mode": "HT", + "rates": { + "beacon": 6000, + "multicast": 24000 + } + } + ], + "interfaces": [ + { + "name": "WAN", + "role": "upstream", + "services": [ "lldp", "dhcp-snooping" ], + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + } + }, + { + "name": "WAN100", + "role": "upstream", + "services": [ "lldp", "dhcp-snooping" ], + "vlan": { + "id": 100 + }, + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ssids": [ + { + "name": "TIP OpenWiFi", + "wifi-bands": [ + "2G", "5G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWiFi", + "ieee80211w": "optional" + }, + "services": [ "wifi-frames"] + } + ] + } + ], + "metrics": { + "statistics": { + "interval": 120, + "types": [ "ssids", "lldp", "clients" ] + }, + "health": { + "interval": 120 + }, + "wifi-frames": { + "filters": [ "probe", + "auth", + "assoc", + "disassoc", + "deauth", + "local-deauth", + "inactive-deauth", + "key-mismatch", + "beacon-report", + "radar-detected"] + }, + "dhcp-snooping": { + "filters": [ "ack", "discover", "offer", "request", "solicit", "reply", "renew" ] + } + }, + "services": { + "lldp": { + "describe": "TIP OpenWiFi", + "location": "LivingLab" + }, + "ssh": { + "port": 22 + } + } +} \ No newline at end of file diff --git a/.gitbook/assets/TIP OpenWiFi 2.x.postman_collection.json b/.gitbook/assets/TIP OpenWiFi 2.x.postman_collection.json new file mode 100644 index 0000000..b038f02 --- /dev/null +++ b/.gitbook/assets/TIP OpenWiFi 2.x.postman_collection.json @@ -0,0 +1,5106 @@ +{ + "info": { + "_postman_id": "74fcdca5-836c-4091-bee7-590803c507ba", + "name": "TIP OpenWiFi 2.x", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "20476771" + }, + "item": [ + { + "name": "Security", + "item": [ + { + "name": "OAuth-Authorize", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "var jsonData = JSON.parse(responseBody);", + "console.log(jsonData)", + "pm.collectionVariables.set(\"ACCESS_TOKEN\", jsonData.access_token);", + "// postman.setEnvironmentVariable(\"AuthToken\", jsonData.access_token);" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "strictSSL": false, + "followRedirects": false, + "disableUrlEncoding": true, + "disabledSystemHeaders": { + "connection": true, + "accept": true + } + }, + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "3a9dafeac8d711e4d497253d1d0a93e91fade96fc99fe310ed258bf0d4248fef", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"userId\": \"tip@ucentral.com\",\n \"password\": \"OpenWifi%123\"\n}" + }, + "url": { + "raw": "https://{{SECURITY_HOSTNAME}}:{{SECURITY_PORTNUMBER}}/api/v1/oauth2", + "protocol": "https", + "host": [ + "{{SECURITY_HOSTNAME}}" + ], + "port": "{{SECURITY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "oauth2" + ] + } + }, + "response": [] + }, + { + "name": "SubOAuth2-Authorize", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "05fecd78bbb08b9dbac3e145b2110a720cff6c5f8afe55e940333d081900800c", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"userId\": \"tip@ucentral.com\",\n \"password\": \"OpenWifi%123\"\n}" + }, + "url": { + "raw": "https://{{SECURITY_HOSTNAME}}:{{SECURITY_PORTNUMBER}}/api/v1/suboauth2", + "protocol": "https", + "host": [ + "{{SECURITY_HOSTNAME}}" + ], + "port": "{{SECURITY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "suboauth2" + ] + } + }, + "response": [] + }, + { + "name": "OAuth-Logout", + "protocolProfileBehavior": { + "strictSSL": false, + "followRedirects": true, + "disableUrlEncoding": true, + "disabledSystemHeaders": { + "connection": true, + "content-type": true, + "accept": true, + "content-length": true + } + }, + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "721adcf6f04f044ce190ae11baf93c0d14d8c2cb4623b536b1acd16f5c7f9754", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"userId\": \"tip@ucentral.com\",\n \"password\": \"OpenWifi%123\"\n}" + }, + "url": { + "raw": "https://{{SECURITY_HOSTNAME}}:{{SECURITY_PORTNUMBER}}/api/v1/oauth2/721adcf6f04f044ce190ae11baf93c0d14d8c2cb4623b536b1acd16f5c7f9754", + "protocol": "https", + "host": [ + "{{SECURITY_HOSTNAME}}" + ], + "port": "{{SECURITY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "oauth2", + "721adcf6f04f044ce190ae11baf93c0d14d8c2cb4623b536b1acd16f5c7f9754" + ] + } + }, + "response": [] + }, + { + "name": "SubOAuth-Logout", + "protocolProfileBehavior": { + "strictSSL": false, + "followRedirects": false, + "disableUrlEncoding": true, + "disabledSystemHeaders": { + "connection": true, + "content-type": true, + "accept": true + } + }, + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "https://{{SECURITY_HOSTNAME}}:{{SECURITY_PORTNUMBER}}/api/v1/suboauth2", + "protocol": "https", + "host": [ + "{{SECURITY_HOSTNAME}}" + ], + "port": "{{SECURITY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "suboauth2" + ] + } + }, + "response": [] + }, + { + "name": "OAuth-Authorize", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "strictSSL": false, + "followRedirects": false, + "disableUrlEncoding": true, + "disabledSystemHeaders": { + "connection": true, + "content-type": true, + "accept": true + } + }, + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "3a9dafeac8d711e4d497253d1d0a93e91fade96fc99fe310ed258bf0d4248fef", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"userId\": \"tip@ucentral.com\",\n \"password\": \"OpenWifi%123\"\n}" + }, + "url": { + "raw": "https://{{SECURITY_HOSTNAME}}:{{SECURITY_PORTNUMBER}}/api/v1/oauth2", + "protocol": "https", + "host": [ + "{{SECURITY_HOSTNAME}}" + ], + "port": "{{SECURITY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "oauth2" + ] + } + }, + "response": [] + }, + { + "name": "Get Endpoints", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{SECURITY_HOSTNAME}}:{{SECURITY_PORTNUMBER}}/api/v1/systemEndpoints", + "protocol": "https", + "host": [ + "{{SECURITY_HOSTNAME}}" + ], + "port": "{{SECURITY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "systemEndpoints" + ] + } + }, + "response": [] + }, + { + "name": "Users", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "3a9dafeac8d711e4d497253d1d0a93e91fade96fc99fe310ed258bf0d4248fef", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"userId\": \"tip@ucentral.com\",\n \"password\": \"OpenWifi%123\"\n}" + }, + "url": { + "raw": "https://{{SECURITY_HOSTNAME}}:{{SECURITY_PORTNUMBER}}/api/v1/users", + "protocol": "https", + "host": [ + "{{SECURITY_HOSTNAME}}" + ], + "port": "{{SECURITY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "users" + ] + } + }, + "response": [] + }, + { + "name": "Create User", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "3a9dafeac8d711e4d497253d1d0a93e91fade96fc99fe310ed258bf0d4248fef", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"id\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n \"name\": \"string\",\n \"description\": \"string\",\n \"avatar\": \"string\",\n \"email\": \"user@example.com\",\n \"validated\": true,\n \"validationEmail\": \"user@example.com\",\n \"validationDate\": 0,\n \"created\": 0,\n \"validationURI\": \"string\",\n \"changePassword\": true,\n \"lastLogin\": 0,\n \"currentLoginURI\": \"string\",\n \"lastPasswordChange\": 0,\n \"lastEmailCheck\": 0,\n \"currentPassword\": \"OpenWifi%123\",\n \"lastPasswords\": [\n \"string\"\n ],\n \"waitingForEmailCheck\": true,\n \"notes\": [\n {\n \"created\": 0,\n \"createdBy\": \"string\",\n \"note\": \"string\"\n }\n ],\n \"location\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n \"owner\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n \"suspended\": true,\n \"blackListed\": true,\n \"locale\": \"string\",\n \"userRole\": \"root\",\n \"oauthType\": \"internal\",\n \"oauthUserInfo\": \"string\",\n \"securityPolicy\": \"string\",\n \"securityPolicyChange\": 0,\n \"modified\": 0,\n \"userTypeProprietaryInfo\": {\n \"mobiles\": [\n {\n \"number\": \"string\",\n \"verified\": true,\n \"primary\": true\n }\n ],\n \"authenticatorSecret\": \"string\",\n \"mfa\": {\n \"enabled\": true,\n \"method\": \"sms\"\n }\n },\n \"signupUUID\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\"\n}" + }, + "url": { + "raw": "https://{{SECURITY_HOSTNAME}}:{{SECURITY_PORTNUMBER}}/api/v1/user/0", + "protocol": "https", + "host": [ + "{{SECURITY_HOSTNAME}}" + ], + "port": "{{SECURITY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "user", + "0" + ] + } + }, + "response": [] + }, + { + "name": "Delete User", + "request": { + "method": "DELETE", + "header": [], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "https://{{SECURITY_HOSTNAME}}:{{SECURITY_PORTNUMBER}}/api/v1/user/3fa85f64-5717-4562-b3fc-2c963f66afa6", + "protocol": "https", + "host": [ + "{{SECURITY_HOSTNAME}}" + ], + "port": "{{SECURITY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "user", + "3fa85f64-5717-4562-b3fc-2c963f66afa6" + ] + } + }, + "response": [] + }, + { + "name": "Modify User", + "request": { + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"id\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n \"name\": \"string\",\n \"description\": \"string\",\n \"avatar\": \"string\",\n \"email\": \"user@example.com\",\n \"validated\": true,\n \"validationEmail\": \"user@example.com\",\n \"validationDate\": 0,\n \"created\": 0,\n \"validationURI\": \"string\",\n \"changePassword\": true,\n \"lastLogin\": 0,\n \"currentLoginURI\": \"string\",\n \"lastPasswordChange\": 0,\n \"lastEmailCheck\": 0,\n \"currentPassword\": \"OpenWifi%321\",\n \"lastPasswords\": [\n \"OpenWifi%123\"\n ],\n \"waitingForEmailCheck\": true,\n \"notes\": [\n {\n \"created\": 0,\n \"createdBy\": \"string\",\n \"note\": \"string\"\n }\n ],\n \"location\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n \"owner\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n \"suspended\": true,\n \"blackListed\": true,\n \"locale\": \"string\",\n \"userRole\": \"root\",\n \"oauthType\": \"internal\",\n \"oauthUserInfo\": \"string\",\n \"securityPolicy\": \"string\",\n \"securityPolicyChange\": 0,\n \"modified\": 0,\n \"userTypeProprietaryInfo\": {\n \"mobiles\": [\n {\n \"number\": \"string\",\n \"verified\": true,\n \"primary\": true\n }\n ],\n \"authenticatorSecret\": \"string\",\n \"mfa\": {\n \"enabled\": true,\n \"method\": \"sms\"\n }\n },\n \"signupUUID\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\"\n}" + }, + "url": { + "raw": "https://{{SECURITY_HOSTNAME}}:{{SECURITY_PORTNUMBER}}/api/v1/user/3fa85f64-5717-4562-b3fc-2c963f66afa6", + "protocol": "https", + "host": [ + "{{SECURITY_HOSTNAME}}" + ], + "port": "{{SECURITY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "user", + "3fa85f64-5717-4562-b3fc-2c963f66afa6" + ] + } + }, + "response": [] + }, + { + "name": "System", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "5785b2e5d21c4d6236bb8a0319e252d98034f8e36a72871b4673bf02d7c24c6c", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{SECURITY_HOSTNAME}}:{{SECURITY_PORTNUMBER}}/api/v1/system?command=info", + "protocol": "https", + "host": [ + "{{SECURITY_HOSTNAME}}" + ], + "port": "{{SECURITY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "system" + ], + "query": [ + { + "key": "command", + "value": "info" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Gateway", + "item": [ + { + "name": "Get Devices", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/devices", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "devices" + ] + } + }, + "response": [] + }, + { + "name": "Get Device Capabilities", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/capabilities", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "capabilities" + ] + } + }, + "response": [] + }, + { + "name": "Get Default Configurations", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/default_configurations/", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "default_configurations", + "" + ] + } + }, + "response": [] + }, + { + "name": "Configure", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "url": { + "raw": "" + } + }, + "response": [] + }, + { + "name": "Systeminfo", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/system?command=info", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "system" + ], + "query": [ + { + "key": "command", + "value": "info" + } + ] + } + }, + "response": [] + }, + { + "name": "Device Dashboard", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/deviceDashboard", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "deviceDashboard" + ] + } + }, + "response": [] + }, + { + "name": "Get Specific Device", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "serial", + "value": "00037f941710", + "type": "text", + "disabled": true + } + ], + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/device/{{SERIAL}}", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "device", + "{{SERIAL}}" + ] + } + }, + "response": [] + }, + { + "name": "commands", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/commands", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "commands" + ] + } + }, + "response": [] + }, + { + "name": "Add Device", + "request": { + "method": "GET", + "header": [] + }, + "response": [] + }, + { + "name": "Post configuration to device", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"serialNumber\": \"903cb36ae255\",\n \"when\": 0,\n \"UUID\": 1,\n \"configuration\": {\n \"uuid\": 1,\n \"radios\": [\n {\n \"band\": \"2G\",\n \"country\": \"US\",\n \"channel-width\": 20\n },\n {\n \"band\": \"5G\",\n \"country\": \"US\",\n \"channel-width\": 80\n }\n ],\n \"interfaces\": [\n {\n \"name\": \"WAN\",\n \"role\": \"upstream\",\n \"services\": [\n \"ssh\",\n \"lldp\",\n \"dhcp-snooping\"\n ],\n \"ethernet\": [\n {\n \"select-ports\": [\n \"WAN*\"\n ]\n }\n ],\n \"ipv4\": {\n \"addressing\": \"dynamic\"\n },\n \"ssids\": [\n {\n \"name\": \"ssid_wpa_eap_2g\",\n \"bss-mode\": \"ap\",\n \"wifi-bands\": [\n \"2G\"\n ],\n \"services\": [\n \"wifi-frames\"\n ],\n \"encryption\": {\n \"proto\": \"wpa\",\n \"ieee80211w\": \"optional\"\n },\n \"radius\": {\n \"authentication\": {\n \"host\": \"10.10.1.221\",\n \"port\": 1812,\n \"secret\": \"testing123\"\n },\n \"accounting\": {\n \"host\": \"10.10.1.221\",\n \"port\": 1813,\n \"secret\": \"testing123\"\n }\n }\n },\n {\n \"name\": \"ssid_wpa_eap_5g\",\n \"bss-mode\": \"ap\",\n \"wifi-bands\": [\n \"5G\"\n ],\n \"services\": [\n \"wifi-frames\"\n ],\n \"encryption\": {\n \"proto\": \"wpa\",\n \"ieee80211w\": \"optional\"\n },\n \"radius\": {\n \"authentication\": {\n \"host\": \"10.10.1.221\",\n \"port\": 1812,\n \"secret\": \"testing123\"\n },\n \"accounting\": {\n \"host\": \"10.10.1.221\",\n \"port\": 1813,\n \"secret\": \"testing123\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"LAN\",\n \"role\": \"downstream\",\n \"services\": [\n \"ssh\",\n \"lldp\",\n \"dhcp-snooping\"\n ],\n \"ethernet\": [\n {\n \"select-ports\": [\n \"LAN*\"\n ]\n }\n ],\n \"ipv4\": {\n \"addressing\": \"static\",\n \"subnet\": \"192.168.1.1/16\",\n \"dhcp\": {\n \"lease-first\": 10,\n \"lease-count\": 10000,\n \"lease-time\": \"6h\"\n }\n }\n }\n ],\n \"metrics\": {\n \"statistics\": {\n \"interval\": 60,\n \"types\": [\n \"ssids\",\n \"lldp\",\n \"clients\"\n ]\n },\n \"health\": {\n \"interval\": 120\n },\n \"wifi-frames\": {\n \"filters\": [\n \"probe\",\n \"auth\",\n \"assoc\",\n \"disassoc\",\n \"deauth\",\n \"local-deauth\",\n \"inactive-deauth\",\n \"key-mismatch\",\n \"beacon-report\",\n \"radar-detected\"\n ]\n },\n \"dhcp-snooping\": {\n \"filters\": [\n \"ack\",\n \"discover\",\n \"offer\",\n \"request\",\n \"solicit\",\n \"reply\",\n \"renew\"\n ]\n }\n },\n \"services\": {\n \"lldp\": {\n \"describe\": \"TIP OpenWiFi\",\n \"location\": \"QA\"\n },\n \"ssh\": {\n \"port\": 22\n }\n }\n }\n}" + }, + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/device/903cb36ae255/configure", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "device", + "903cb36ae255", + "configure" + ] + } + }, + "response": [] + }, + { + "name": "Ping device", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"serialNumber\": \"903cb36ae255\"\n}" + }, + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/device/903cb36ae255/ping", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "device", + "903cb36ae255", + "ping" + ] + } + }, + "response": [] + }, + { + "name": "reboot ap", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"serialNumber\": \"903cb36ae255\",\n \"when\": 0\n}" + }, + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/device/903cb36ae255/reboot", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "device", + "903cb36ae255", + "reboot" + ] + } + }, + "response": [] + }, + { + "name": "Factory reset AP", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"serialNumber\": \"903cb36ae255\",\n \"when\": 0,\n \"keepRedirector\": true\n}" + }, + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/device/903cb36ae255/factory", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "device", + "903cb36ae255", + "factory" + ] + } + }, + "response": [] + }, + { + "name": "Blink LED on device", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"serialNumber\": \"903cb36ae255\",\n \"when\": 0,\n \"duration\": 1,\n \"pattern\": \"on\"\n}" + }, + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/device/903cb36ae255/leds", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "device", + "903cb36ae255", + "leds" + ] + } + }, + "response": [] + }, + { + "name": "Trace on device", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"serialNumber\": \"903cb36ae255\",\n \"when\": 0,\n \"duration\": 1,\n \"numberOfPackets\": 0,\n \"network\": \"string\",\n \"interface\": \"string\"\n}" + }, + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/device/903cb36ae255/trace", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "device", + "903cb36ae255", + "trace" + ] + } + }, + "response": [] + }, + { + "name": "Wifi scan", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"serialNumber\": \"903cb36ae255\",\n \"verbose\": true,\n \"activeScan\": true,\n \"selector\": {\n \"bands\": [\n \"2\"\n ]\n }\n}" + }, + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/device/903cb36ae255/wifiscan", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "device", + "903cb36ae255", + "wifiscan" + ] + } + }, + "response": [] + }, + { + "name": "Request a specific message", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"serialNumber\": \"903cb36ae255\",\n \"when\": 0,\n \"message\": \"state\"\n}" + }, + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/device/903cb36ae255/request", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "device", + "903cb36ae255", + "request" + ] + } + }, + "response": [] + }, + { + "name": "Request Queued Events", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"serialNumber\": \"903cb36ae255\",\n \"types\": [\n \"dhcp\"\n ]\n}" + }, + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/device/903cb36ae255/eventqueue", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "device", + "903cb36ae255", + "eventqueue" + ] + } + }, + "response": [] + }, + { + "name": "Telemetry", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"serialNumber\": \"903cb36ae255\",\n \"interval\": 0,\n \"lifetime\": 0,\n \"kafka\": false,\n \"types\": [\n \"dhcp-snooping\"\n ],\n \"uuid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\"\n}" + }, + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/device/903cb36ae255/telemetry", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "device", + "903cb36ae255", + "telemetry" + ] + } + }, + "response": [] + }, + { + "name": "RTTY parameters", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "url": { + "raw": "https://{{GATEWAY_HOSTNAME}}:{{GATEWAY_PORTNUMBER}}/api/v1/device/903cb36ae255/rtty", + "protocol": "https", + "host": [ + "{{GATEWAY_HOSTNAME}}" + ], + "port": "{{GATEWAY_PORTNUMBER}}", + "path": [ + "api", + "v1", + "device", + "903cb36ae255", + "rtty" + ] + } + }, + "response": [] + }, + { + "name": "Edit device", + "request": { + "method": "GET", + "header": [] + }, + "response": [] + } + ], + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ] + } + } + ] + }, + { + "name": "FMS", + "item": [ + { + "name": "FMS", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{FIRMWARE_HOSTNAME}}:{{FIRMWARE_PORTNUMBER}}/api/v1/firmwares?latestOnly=true&deviceType=edgecore_eap101", + "protocol": "https", + "host": [ + "{{FIRMWARE_HOSTNAME}}" + ], + "port": "{{FIRMWARE_PORTNUMBER}}", + "path": [ + "api", + "v1", + "firmwares" + ], + "query": [ + { + "key": "filter", + "value": "rc", + "disabled": true + }, + { + "key": "limit", + "value": "1", + "disabled": true + }, + { + "key": "latestOnly", + "value": "true" + }, + { + "key": "deviceType", + "value": "edgecore_eap101" + } + ] + } + }, + "response": [] + }, + { + "name": "Firmware age", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{FIRMWARE_HOSTNAME}}:{{FIRMWARE_PORTNUMBER}}/api/v1/firmwares?deviceType=cig_wf194c&latestOnly=true", + "protocol": "https", + "host": [ + "{{FIRMWARE_HOSTNAME}}" + ], + "port": "{{FIRMWARE_PORTNUMBER}}", + "path": [ + "api", + "v1", + "firmwares" + ], + "query": [ + { + "key": "deviceType", + "value": "cig_wf194c" + }, + { + "key": "filter", + "value": "rc", + "disabled": true + }, + { + "key": "limit", + "value": "1", + "disabled": true + }, + { + "key": "latestOnly", + "value": "true" + } + ] + } + }, + "response": [] + } + ], + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ] + } + } + ] + }, + { + "name": "Provisioning", + "item": [ + { + "name": "Prov-location", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/location", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "location" + ] + } + }, + "response": [] + }, + { + "name": "Inventory", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.globals.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/inventory", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "inventory" + ] + } + }, + "response": [] + }, + { + "name": "Venue", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/venue/", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "venue", + "" + ] + } + }, + "response": [] + }, + { + "name": "Map", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/map", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "map" + ] + } + }, + "response": [] + }, + { + "name": "managementPolicy", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [] + }, + "response": [] + }, + { + "name": "configurations", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/configuration/", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "configuration", + "" + ] + } + }, + "response": [] + }, + { + "name": "Ip-to-Country", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/iptocountry/?iplist=190.10.11.147", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "iptocountry", + "" + ], + "query": [ + { + "key": "iplist", + "value": "190.10.11.147" + } + ] + } + }, + "response": [] + }, + { + "name": "configuration", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"VLAN\",\n \"deviceRules\": {\n \"rrm\": \"inherit\",\n \"rcOnly\": \"inherit\",\n \"firmwareUpgrade\": \"inherit\"\n },\n \"deviceTypes\": [\n \"cig_wf188n\",\n \"edgecore_ssw2ac2600\",\n \"indio_um-305ax\",\n \"hfcl_ion4xe\",\n \"wallys_dr40x9\",\n \"udaya_a5-id2\",\n \"x64_vm\"\n ],\n \"entity\": \"e6223c6a-c150-43ea-8286-f2d6395e6d65\",\n \"venue\": \"\",\n \"configuration\": [\n {\n \"name\": \"Radios\",\n \"description\": \"\",\n \"weight\": 1,\n \"configuration\": {\n \"radios\": [\n {\n \"band\": \"5G\",\n \"channel\": 52,\n \"channel-mode\": \"HE\",\n \"channel-width\": 80,\n \"country\": \"CA\"\n },\n {\n \"band\": \"2G\",\n \"channel\": 11,\n \"channel-mode\": \"HE\",\n \"channel-width\": 20,\n \"country\": \"CA\"\n }\n ]\n }\n },\n {\n \"name\": \"Interfaces\",\n \"description\": \"\",\n \"weight\": 1,\n \"configuration\": {\n \"interfaces\": [\n {\n \"name\": \"WAN\",\n \"role\": \"upstream\",\n \"services\": [\n \"lldp\"\n ],\n \"ethernet\": [\n {\n \"select-ports\": [\n \"WAN*\"\n ]\n }\n ],\n \"ipv4\": {\n \"addressing\": \"dynamic\"\n },\n \"ssids\": [\n {\n \"name\": \"OpenWifi\",\n \"role\": \"downstream\",\n \"wifi-bands\": [\n \"2G\",\n \"5G\"\n ],\n \"bss-mode\": \"ap\",\n \"encryption\": {\n \"proto\": \"none\",\n \"ieee80211w\": \"optional\"\n }\n },\n {\n \"name\": \"OpenWifi_wpa\",\n \"role\": \"downstream\",\n \"wifi-bands\": [\n \"2G\",\n \"5G\"\n ],\n \"bss-mode\": \"ap\",\n \"encryption\": {\n \"proto\": \"psk\",\n \"key\": \"OpenWifi\",\n \"ieee80211w\": \"optional\"\n }\n },\n {\n \"name\": \"OpenWifi_wpa2\",\n \"role\": \"downstream\",\n \"wifi-bands\": [\n \"2G\",\n \"5G\"\n ],\n \"bss-mode\": \"ap\",\n \"encryption\": {\n \"proto\": \"psk2\",\n \"key\": \"OpenWifi\",\n \"ieee80211w\": \"optional\"\n }\n },\n {\n \"name\": \"OpenWifi_wpa3\",\n \"role\": \"downstream\",\n \"wifi-bands\": [\n \"2G\",\n \"5G\"\n ],\n \"bss-mode\": \"ap\",\n \"encryption\": {\n \"proto\": \"sae\",\n \"key\": \"OpenWifi\",\n \"ieee80211w\": \"optional\"\n }\n }\n ]\n },\n {\n \"name\": \"LAN\",\n \"role\": \"downstream\",\n \"services\": [\n \"ssh\",\n \"lldp\"\n ],\n \"ethernet\": [\n {\n \"select-ports\": [\n \"LAN*\"\n ]\n }\n ],\n \"ipv4\": {\n \"addressing\": \"static\",\n \"subnet\": \"192.168.1.1/24\",\n \"dhcp\": {\n \"lease-first\": 10,\n \"lease-count\": 100,\n \"lease-time\": \"6h\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"Metrics\",\n \"description\": \"\",\n \"weight\": 1,\n \"configuration\": {\n \"metrics\": {\n \"statistics\": {\n \"interval\": 120,\n \"types\": [\n \"ssids\",\n \"lldp\",\n \"clients\"\n ]\n },\n \"health\": {\n \"interval\": 120\n },\n \"wifi-frames\": {\n \"filters\": [\n \"probe\",\n \"auth\"\n ]\n }\n }\n }\n },\n {\n \"name\": \"Services\",\n \"description\": \"\",\n \"weight\": 1,\n \"configuration\": {\n \"services\": {\n \"lldp\": {\n \"describe\": \"uCentral\",\n \"location\": \"universe\"\n },\n \"ssh\": {\n \"port\": 22\n }\n }\n }\n }\n ]\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/configuration/1", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "configuration", + "1" + ] + } + }, + "response": [] + }, + { + "name": "Systeminfo", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/system?command=info", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "system" + ], + "query": [ + { + "key": "command", + "value": "info" + } + ] + } + }, + "response": [] + }, + { + "name": "Get Inventory", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"ACCESS_TOKEN\"));" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/inventory/", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "inventory", + "" + ] + } + }, + "response": [] + }, + { + "name": "Add device in Inventory", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"serialNumber\":\"deadbeaf0038\",\n \"name\":\"Testing_to_add_device_through_postman\",\n \"rrm\":\"inherit\",\n \"deviceType\":\"edgecore_eap101\",\n \"devClass\":\"any\",\n \"description\":\"For testing API through postman\",\n \"entity\":\"\",\n \"venue\":\"\",\n \"subscriber\":\"\",\n \"__newConfig\":{\n \"rrm\":\"inherit\",\n \"firmwareUpgrade\":\"no\",\n \"firmwareRCOnly\":false,\n \"configuration\":[],\n \"name\":\"device:deadbeaf0038\"\n ,\"description\":\"Created from the Edit Tag menu\",\n \"deviceTypes\":[\"edgecore_eap101\"]\n }\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/inventory/deadbeaf0038", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "inventory", + "deadbeaf0038" + ] + } + }, + "response": [] + }, + { + "name": "Delete the device in Inventory", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/inventory/deadbeaf0038", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "inventory", + "deadbeaf0038" + ] + } + }, + "response": [] + }, + { + "name": "Entity", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "// pm.globals.get(\"BEARERTOKEN\");", + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/entity", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "entity" + ] + } + }, + "response": [] + }, + { + "name": "Add Entity", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\":\"For Testing through postman \",\n \"description\":\"Testing through postman\",\n \"rrm\":\"inherit\",\n \"parent\":\"0000-0000-0000\"\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/entity/1", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "entity", + "1" + ] + } + }, + "response": [] + }, + { + "name": "Delete Entity", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/entity/3b7573b6-e975-4f71-b342-cbd91e6ee701", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "entity", + "3b7573b6-e975-4f71-b342-cbd91e6ee701" + ] + } + }, + "response": [] + }, + { + "name": "Contacts", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/contact", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "contact" + ] + } + }, + "response": [] + }, + { + "name": "Add Contact", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\":\"Prov-Testing-postman\",\n \"type\":\"USER\",\n \"title\":\"Testing_contact\",\n \"salutation\":\"\",\n \"firstname\":\"ProvTesting\",\n \"lastname\":\"Through Postman\",\n \"initials\":\"\",\n \"visual\":\"\",\n \"phones\":[],\n \"mobiles\":[]\n ,\"primaryEmail\":\"tip@ucentral.com\",\n \"secondaryEmail\":\"\",\n \"accessPIN\":\"\",\n \"description\":\"\",\n \"initialNote\":\"\",\n \"entity\":\"0000-0000-0000\",\n \"notes\":[{\"note\":\"\"}]\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/contact/1", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "contact", + "1" + ] + } + }, + "response": [] + }, + { + "name": "Delete contact", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/contact/46c7d377-72dd-4292-8d1b-ff8031fa28e1", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "contact", + "46c7d377-72dd-4292-8d1b-ff8031fa28e1" + ] + } + }, + "response": [] + }, + { + "name": "Location", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/location", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "location" + ] + } + }, + "response": [] + }, + { + "name": "Add Location", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\":\"TIP\",\n \"type\":\"AUTO\",\n \"buildingName\":\"\",\n \"addressLines\":[\"Pedda Rushikonda\"],\n \"city\":\"Visakhapatnam\",\n \"state\":\"Andhra pradesh\",\n \"postal\":\"530045\",\n \"country\":\"IN\",\n \"phones\":[],\n \"mobiles\":[],\n \"geoCode\":\"\",\n \"description\":\"For Testing through Postman\",\n \"initialNote\":\"Testing purposes through Postman\",\n \"entity\":\"0000-0000-0000\",\n \"notes\":[{\"note\":\"Testing purposes\"}]\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/location/1", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "location", + "1" + ] + } + }, + "response": [] + }, + { + "name": "Delete Location", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/location/62dc658c-029a-4118-84b0-a873a704f880", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "location", + "62dc658c-029a-4118-84b0-a873a704f880" + ] + } + }, + "response": [] + }, + { + "name": "Add Venue", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\":\"Prov_testing\",\n \"rrm\":\"on\",\n \"description\":\"For Testing Purposes\",\n \"notes\":[{\"note\":\"For Testing Purposes\"}],\n \"parent\":\"\",\n \"entity\":\"3646302f-5e46-4c98-ad01-f6aebacc26a7\",\n \"location\":\"\"\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/venue/0", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "venue", + "0" + ] + } + }, + "response": [] + }, + { + "name": "Delete Venue", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/venue/ec8ef153-b94c-4ea1-a191-48fd26a23ff1", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "venue", + "ec8ef153-b94c-4ea1-a191-48fd26a23ff1" + ] + } + }, + "response": [] + }, + { + "name": "Operator", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/operator", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "operator" + ] + } + }, + "response": [] + }, + { + "name": "Edit Inventory", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"description\": \"For testing API through automation after editing\",\n \"devClass\": \"any\",\n \"deviceType\": \"edgecore_eap101\",\n \"entity\": \"\",\n \"name\": \"Testing_to_add_device_through_automation\",\n \"notes\": [],\n \"rrm\": \"inherit\",\n \"venue\": \"\"\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/inventory/deadbeaf0038", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "inventory", + "deadbeaf0038" + ] + } + }, + "response": [] + }, + { + "name": "Edit Entity", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"description\": \"Testing through postman\",\n \"name\": \"For Testing through postman API's\",\n \"notes\": [],\n \"rrm\": \"inherit\",\n \"sourceIP\": []\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/entity/3b7573b6-e975-4f71-b342-cbd91e6ee701", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "entity", + "3b7573b6-e975-4f71-b342-cbd91e6ee701" + ] + } + }, + "response": [] + }, + { + "name": "Edit Contact", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"accessPIN\": \"\",\n \"description\": \"\",\n \"entity\": \"0000-0000-0000\",\n \"firstname\": \"ProvTesting\",\n \"initials\": \"\",\n \"lastname\": \"Through Postman\",\n \"mobiles\": [],\n \"name\": \"Prov-Testing-postman API's\",\n \"notes\": [],\n \"phones\": [],\n \"primaryEmail\": \"tip@ucentral.com\",\n \"salutation\": \"\",\n \"secondaryEmail\": \"\",\n \"title\": \"Testing_contact\",\n \"type\": \"USER\"\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/contact/46c7d377-72dd-4292-8d1b-ff8031fa28e1", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "contact", + "46c7d377-72dd-4292-8d1b-ff8031fa28e1" + ] + } + }, + "response": [] + }, + { + "name": "Edit Location", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "console.log(pm.collectionVariables.get(\"BEARERTOKEN\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"addressLines\": [\n \"Pedda Rushikonda\"\n ],\n \"buildingName\": \"\",\n \"city\": \"Visakhapatnam\",\n \"country\": \"IN\",\n \"created\": 1654754601,\n \"description\": \"For Testing through Postman after EDiting\",\n \"entity\": \"0000-0000-0000\",\n \"geoCode\": \"\",\n \"id\": \"b415f8ea-ee1f-4572-be26-3370a07b27c6\",\n \"inUse\": [],\n \"managementPolicy\": \"\",\n \"mobiles\": [],\n \"modified\": 1654754601,\n \"name\": \"TIP\",\n \"phones\": [],\n \"postal\": \"530045\",\n \"state\": \"Andhra pradesh\",\n \"tags\": [],\n \"type\": \"AUTO\"\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/location/b415f8ea-ee1f-4572-be26-3370a07b27c6", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "location", + "b415f8ea-ee1f-4572-be26-3370a07b27c6" + ] + } + }, + "response": [] + }, + { + "name": "Edit Venue", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"description\": \"For testing Purposes through Automation\",\n \"location\": \"\",\n \"name\": \"Testing Prov\",\n \"notes\": [],\n \"rrm\": \"inherit\",\n \"sourceIP\": []\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/venue/ec8ef153-b94c-4ea1-a191-48fd26a23ff1", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "venue", + "ec8ef153-b94c-4ea1-a191-48fd26a23ff1" + ] + } + }, + "response": [] + }, + { + "name": "add device with config", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"serialNumber\": \"deadbeef1038\",\n \"name\": \"Testing AP\",\n \"rrm\": \"inherit\",\n \"deviceType\": \"cig_wf194c\",\n \"devClass\": \"any\",\n \"description\": \"Testing AP\",\n \"entity\": \"\",\n \"venue\": \"\",\n \"subscriber\": \"\",\n \"__newConfig\": {\n \"rrm\": \"inherit\",\n \"firmwareUpgrade\": \"no\",\n \"firmwareRCOnly\": false,\n \"configuration\": [\n {\n \"name\": \"Radios\",\n \"description\": \"\",\n \"weight\": 1,\n \"configuration\": {\n \"radios\": [\n {\n \"band\": \"2G\",\n \"country\": \"US\",\n \"channel-width\": 20,\n \"channel\": 1\n },\n {\n \"band\": \"5G\",\n \"country\": \"US\",\n \"channel-width\": 80,\n \"channel\": 36\n }\n ]\n }\n },\n {\n \"name\": \"Interfaces\",\n \"description\": \"\",\n \"weight\": 1,\n \"configuration\": {\n \"interfaces\": [\n {\n \"name\": \"WAN\",\n \"role\": \"upstream\",\n \"services\": [\n \"ssh\",\n \"lldp\",\n \"dhcp-snooping\"\n ],\n \"ethernet\": [\n {\n \"select-ports\": [\n \"WAN*\"\n ]\n }\n ],\n \"ipv4\": {\n \"addressing\": \"dynamic\"\n },\n \"ssids\": [\n {\n \"name\": \"ssid_wpa_eap_2g\",\n \"bss-mode\": \"ap\",\n \"wifi-bands\": [\n \"2G\"\n ],\n \"services\": [\n \"wifi-frames\"\n ],\n \"encryption\": {\n \"proto\": \"wpa\",\n \"ieee80211w\": \"optional\"\n },\n \"radius\": {\n \"authentication\": {\n \"host\": \"10.10.1.221\",\n \"port\": 1812,\n \"secret\": \"testing123\"\n },\n \"accounting\": {\n \"host\": \"10.10.1.221\",\n \"port\": 1813,\n \"secret\": \"testing123\"\n }\n }\n },\n {\n \"name\": \"ssid_wpa_eap_5g\",\n \"bss-mode\": \"ap\",\n \"wifi-bands\": [\n \"5G\"\n ],\n \"services\": [\n \"wifi-frames\"\n ],\n \"encryption\": {\n \"proto\": \"wpa\",\n \"ieee80211w\": \"optional\"\n },\n \"radius\": {\n \"authentication\": {\n \"host\": \"10.10.1.221\",\n \"port\": 1812,\n \"secret\": \"testing123\"\n },\n \"accounting\": {\n \"host\": \"10.10.1.221\",\n \"port\": 1813,\n \"secret\": \"testing123\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"LAN\",\n \"role\": \"downstream\",\n \"services\": [\n \"ssh\",\n \"lldp\",\n \"dhcp-snooping\"\n ],\n \"ethernet\": [\n {\n \"select-ports\": [\n \"LAN*\"\n ]\n }\n ],\n \"ipv4\": {\n \"addressing\": \"static\",\n \"subnet\": \"192.168.1.1/16\",\n \"dhcp\": {\n \"lease-first\": 10,\n \"lease-count\": 10000,\n \"lease-time\": \"6h\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"Metrics\",\n \"description\": \"\",\n \"weight\": 1,\n \"configuration\": {\n \"metrics\": {\n \"statistics\": {\n \"interval\": 60,\n \"types\": [\n \"ssids\",\n \"lldp\",\n \"clients\"\n ]\n },\n \"health\": {\n \"interval\": 120\n },\n \"wifi-frames\": {\n \"filters\": [\n \"probe\",\n \"auth\",\n \"assoc\",\n \"disassoc\",\n \"deauth\",\n \"local-deauth\",\n \"inactive-deauth\",\n \"key-mismatch\",\n \"beacon-report\",\n \"radar-detected\"\n ]\n },\n \"dhcp-snooping\": {\n \"filters\": [\n \"ack\",\n \"discover\",\n \"offer\",\n \"request\",\n \"solicit\",\n \"reply\",\n \"renew\"\n ]\n }\n }\n }\n },\n {\n \"name\": \"Services\",\n \"description\": \"\",\n \"weight\": 1,\n \"configuration\": {\n \"services\": {\n \"lldp\": {\n \"describe\": \"TIP OpenWiFi\",\n \"location\": \"QA\"\n },\n \"ssh\": {\n \"port\": 22\n }\n }\n }\n }\n ],\n \"name\": \"device:deadbeef1038\",\n \"description\": \"Created from the Edit Tag menu\",\n \"deviceTypes\": [\n \"cig_wf194c\"\n ]\n }\n }" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/inventory/deadbeef1038?createObjects={\"objects\":[{\"configuration\":{\"rrm\":\"inherit\",\"firmwareUpgrade\":\"no\",\"firmwareRCOnly\":false,\"configuration\":[{\"name\":\"Radios\",\"description\":\"\",\"weight\":1,\"configuration\":{\"radios\":[{\"band\":\"2G\",\"country\":\"US\",\"channel-width\":20,\"channel\":1},{\"band\":\"5G\",\"country\":\"US\",\"channel-width\":80,\"channel\":36}]}},{\"name\":\"Interfaces\",\"description\":\"\",\"weight\":1,\"configuration\":{\"interfaces\":[{\"name\":\"WAN\",\"role\":\"upstream\",\"services\":[\"ssh\",\"lldp\",\"dhcp-snooping\"],\"ethernet\":[{\"select-ports\":[\"WAN*\"]}],\"ipv4\":{\"addressing\":\"dynamic\"},\"ssids\":[{\"name\":\"ssid_wpa_eap_2g\",\"bss-mode\":\"ap\",\"wifi-bands\":[\"2G\"],\"services\":[\"wifi-frames\"],\"encryption\":{\"proto\":\"wpa\",\"ieee80211w\":\"optional\"},\"radius\":{\"authentication\":{\"host\":\"10.10.1.221\",\"port\":1812,\"secret\":\"testing123\"},\"accounting\":{\"host\":\"10.10.1.221\",\"port\":1813,\"secret\":\"testing123\"}}},{\"name\":\"ssid_wpa_eap_5g\",\"bss-mode\":\"ap\",\"wifi-bands\":[\"5G\"],\"services\":[\"wifi-frames\"],\"encryption\":{\"proto\":\"wpa\",\"ieee80211w\":\"optional\"},\"radius\":{\"authentication\":{\"host\":\"10.10.1.221\",\"port\":1812,\"secret\":\"testing123\"},\"accounting\":{\"host\":\"10.10.1.221\",\"port\":1813,\"secret\":\"testing123\"}}}]},{\"name\":\"LAN\",\"role\":\"downstream\",\"services\":[\"ssh\",\"lldp\",\"dhcp-snooping\"],\"ethernet\":[{\"select-ports\":[\"LAN*\"]}],\"ipv4\":{\"addressing\":\"static\",\"subnet\":\"192.168.1.1/16\",\"dhcp\":{\"lease-first\":10,\"lease-count\":10000,\"lease-time\":\"6h\"}}}]}},{\"name\":\"Metrics\",\"description\":\"\",\"weight\":1,\"configuration\":{\"metrics\":{\"statistics\":{\"interval\":60,\"types\":[\"ssids\",\"lldp\",\"clients\"]},\"health\":{\"interval\":120},\"wifi-frames\":{\"filters\":[\"probe\",\"auth\",\"assoc\",\"disassoc\",\"deauth\",\"local-deauth\",\"inactive-deauth\",\"key-mismatch\",\"beacon-report\",\"radar-detected\"]},\"dhcp-snooping\":{\"filters\":[\"ack\",\"discover\",\"offer\",\"request\",\"solicit\",\"reply\",\"renew\"]}}}},{\"name\":\"Services\",\"description\":\"\",\"weight\":1,\"configuration\":{\"services\":{\"lldp\":{\"describe\":\"TIP OpenWiFi\",\"location\":\"QA\"},\"ssh\":{\"port\":22}}}}],\"name\":\"device:deadbeef1038\",\"description\":\"Created from the Edit Tag menu\",\"deviceTypes\":[\"cig_wf194c\"]}}]}", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "inventory", + "deadbeef1038" + ], + "query": [ + { + "key": "createObjects", + "value": "{\"objects\":[{\"configuration\":{\"rrm\":\"inherit\",\"firmwareUpgrade\":\"no\",\"firmwareRCOnly\":false,\"configuration\":[{\"name\":\"Radios\",\"description\":\"\",\"weight\":1,\"configuration\":{\"radios\":[{\"band\":\"2G\",\"country\":\"US\",\"channel-width\":20,\"channel\":1},{\"band\":\"5G\",\"country\":\"US\",\"channel-width\":80,\"channel\":36}]}},{\"name\":\"Interfaces\",\"description\":\"\",\"weight\":1,\"configuration\":{\"interfaces\":[{\"name\":\"WAN\",\"role\":\"upstream\",\"services\":[\"ssh\",\"lldp\",\"dhcp-snooping\"],\"ethernet\":[{\"select-ports\":[\"WAN*\"]}],\"ipv4\":{\"addressing\":\"dynamic\"},\"ssids\":[{\"name\":\"ssid_wpa_eap_2g\",\"bss-mode\":\"ap\",\"wifi-bands\":[\"2G\"],\"services\":[\"wifi-frames\"],\"encryption\":{\"proto\":\"wpa\",\"ieee80211w\":\"optional\"},\"radius\":{\"authentication\":{\"host\":\"10.10.1.221\",\"port\":1812,\"secret\":\"testing123\"},\"accounting\":{\"host\":\"10.10.1.221\",\"port\":1813,\"secret\":\"testing123\"}}},{\"name\":\"ssid_wpa_eap_5g\",\"bss-mode\":\"ap\",\"wifi-bands\":[\"5G\"],\"services\":[\"wifi-frames\"],\"encryption\":{\"proto\":\"wpa\",\"ieee80211w\":\"optional\"},\"radius\":{\"authentication\":{\"host\":\"10.10.1.221\",\"port\":1812,\"secret\":\"testing123\"},\"accounting\":{\"host\":\"10.10.1.221\",\"port\":1813,\"secret\":\"testing123\"}}}]},{\"name\":\"LAN\",\"role\":\"downstream\",\"services\":[\"ssh\",\"lldp\",\"dhcp-snooping\"],\"ethernet\":[{\"select-ports\":[\"LAN*\"]}],\"ipv4\":{\"addressing\":\"static\",\"subnet\":\"192.168.1.1/16\",\"dhcp\":{\"lease-first\":10,\"lease-count\":10000,\"lease-time\":\"6h\"}}}]}},{\"name\":\"Metrics\",\"description\":\"\",\"weight\":1,\"configuration\":{\"metrics\":{\"statistics\":{\"interval\":60,\"types\":[\"ssids\",\"lldp\",\"clients\"]},\"health\":{\"interval\":120},\"wifi-frames\":{\"filters\":[\"probe\",\"auth\",\"assoc\",\"disassoc\",\"deauth\",\"local-deauth\",\"inactive-deauth\",\"key-mismatch\",\"beacon-report\",\"radar-detected\"]},\"dhcp-snooping\":{\"filters\":[\"ack\",\"discover\",\"offer\",\"request\",\"solicit\",\"reply\",\"renew\"]}}}},{\"name\":\"Services\",\"description\":\"\",\"weight\":1,\"configuration\":{\"services\":{\"lldp\":{\"describe\":\"TIP OpenWiFi\",\"location\":\"QA\"},\"ssh\":{\"port\":22}}}}],\"name\":\"device:deadbeef1038\",\"description\":\"Created from the Edit Tag menu\",\"deviceTypes\":[\"cig_wf194c\"]}}]}" + } + ] + } + }, + "response": [] + }, + { + "name": "Service class", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/serviceClass?operatorId=aa82244c-3de6-4b76-9eec-fa7e8b835fca", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "serviceClass" + ], + "query": [ + { + "key": "operatorId", + "value": "aa82244c-3de6-4b76-9eec-fa7e8b835fca" + } + ] + } + }, + "response": [] + }, + { + "name": "create service class", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"For testing the API\",\n \"billingCode\": \"00000\",\n \"description\": \"For testing the API through postman\",\n \"period\": \"monthly\",\n \"cost\": 0,\n \"currency\": \"USD\",\n \"notes\": [\n {\n \"note\": \"For testing the API through postman\"\n }\n ],\n \"operatorId\": \"aa82244c-3de6-4b76-9eec-fa7e8b835fca\"\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/serviceClass/1", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "serviceClass", + "1" + ] + } + }, + "response": [] + }, + { + "name": "Edit Service class", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"For testing the API\",\n \"billingCode\": \"00000\",\n \"description\": \"For testing the API through postman1 after editing\",\n \"period\": \"monthly\",\n \"cost\": 0,\n \"currency\": \"USD\",\n \"notes\": []\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/serviceClass/46f9a21a-490d-4a13-a7e8-bb1a2bc30bab", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "serviceClass", + "46f9a21a-490d-4a13-a7e8-bb1a2bc30bab" + ] + } + }, + "response": [] + }, + { + "name": "Get specific map", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/map/ab5ec59a-a9c9-4f2e-bd1c-a98b7ad33613", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "map", + "ab5ec59a-a9c9-4f2e-bd1c-a98b7ad33613" + ] + } + }, + "response": [] + }, + { + "name": "Create Map", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"access\": {\n \"list\": []\n },\n \"created\": 1654266780,\n \"creator\": \"11111111-0000-0000-6666-999999999999\",\n \"data\": \"{\\\"elements\\\":[{\\\"id\\\":\\\"entity/0000-0000-0000\\\",\\\"position\\\":{\\\"x\\\":788.0001984205973,\\\"y\\\":-228}},{\\\"id\\\":\\\"entity/0d3b713c-579f-4449-b005-980fc45266f7\\\",\\\"position\\\":{\\\"x\\\":125.00091086366538,\\\"y\\\":110}},{\\\"id\\\":\\\"entity/25e3781c-ff89-4060-98de-72f2f469ece7\\\",\\\"position\\\":{\\\"x\\\":0.00013680958416162147,\\\"y\\\":220}},{\\\"id\\\":\\\"venue/d25b862d-7211-4f5d-8980-eb796cf90259\\\",\\\"position\\\":{\\\"x\\\":0.0009741442442360648,\\\"y\\\":330}},{\\\"id\\\":\\\"entity/3bf7563a-3d9d-11ec-bc4b-6ed02b842da1\\\",\\\"position\\\":{\\\"x\\\":375.0004521666363,\\\"y\\\":110}},{\\\"id\\\":\\\"entity/6a657863-9940-4303-ac68-4cc10d3078ec\\\",\\\"position\\\":{\\\"x\\\":633.0000704105611,\\\"y\\\":310}},{\\\"id\\\":\\\"entity/7ef6dd8e-5ad3-47d6-951f-681adcf2171c\\\",\\\"position\\\":{\\\"x\\\":857.0000877260527,\\\"y\\\":184}},{\\\"id\\\":\\\"entity/da165a23-2562-4a1a-b0c5-8f6e955a2e01\\\",\\\"position\\\":{\\\"x\\\":1125.000287727392,\\\"y\\\":110}},{\\\"id\\\":\\\"venue/b7c1825b-2f25-41b7-8a39-b51b07a5bc64\\\",\\\"position\\\":{\\\"x\\\":1339.0000824838032,\\\"y\\\":220}},{\\\"id\\\":\\\"entity/e6223c6a-c150-43ea-8286-f2d6395e6d65\\\",\\\"position\\\":{\\\"x\\\":1625.000942559204,\\\"y\\\":110}},{\\\"id\\\":\\\"entity/4002042d-b2a7-4a74-bde3-10229ab889a3\\\",\\\"position\\\":{\\\"x\\\":1093.0008368135925,\\\"y\\\":592}},{\\\"id\\\":\\\"entity/c3993947-f5af-4530-9f6e-72edb767abfe\\\",\\\"position\\\":{\\\"x\\\":1501.0009763642392,\\\"y\\\":462}},{\\\"id\\\":\\\"entity/ee468f28-465d-47bc-8ffe-b02678450fd8\\\",\\\"position\\\":{\\\"x\\\":1875.0002469570716,\\\"y\\\":220}},{\\\"id\\\":\\\"device/903cb3bb24df\\\",\\\"position\\\":{\\\"x\\\":354.0006993336034,\\\"y\\\":264}},{\\\"id\\\":\\\"device/68215f9d076a\\\",\\\"position\\\":{\\\"x\\\":887.0006396562085,\\\"y\\\":352}}],\\\"zoom\\\":0.5,\\\"position\\\":[-100.25009594166397,168],\\\"rootNode\\\":\\\"entity/0000-0000-0000\\\"}\",\n \"description\": \"\",\n \"entity\": \"\",\n \"id\": \"d24b07e9-9925-47d7-b7e6-4cc28fb11603\",\n \"managementPolicy\": \"\",\n \"modified\": 1654266955,\n \"name\": \"Maps from API\",\n \"notes\": [],\n \"tags\": [],\n \"venue\": \"\",\n \"visibility\": \"public\"\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/map/0", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "map", + "0" + ] + } + }, + "response": [] + }, + { + "name": "Edit Map", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"access\": {\n \"list\": []\n },\n \"created\": 1654267598,\n \"creator\": \"11111111-0000-0000-6666-999999999999\",\n \"data\": \"{\\\"elements\\\":[{\\\"id\\\":\\\"entity/0000-0000-0000\\\",\\\"position\\\":{\\\"x\\\":742.0002986856452,\\\"y\\\":-258}},{\\\"id\\\":\\\"entity/0d3b713c-579f-4449-b005-980fc45266f7\\\",\\\"position\\\":{\\\"x\\\":125.0000746112698,\\\"y\\\":110}},{\\\"id\\\":\\\"entity/25e3781c-ff89-4060-98de-72f2f469ece7\\\",\\\"position\\\":{\\\"x\\\":0.000987247185699772,\\\"y\\\":220}},{\\\"id\\\":\\\"venue/d25b862d-7211-4f5d-8980-eb796cf90259\\\",\\\"position\\\":{\\\"x\\\":0.00015366265594566887,\\\"y\\\":330}},{\\\"id\\\":\\\"entity/3bf7563a-3d9d-11ec-bc4b-6ed02b842da1\\\",\\\"position\\\":{\\\"x\\\":375.00078943444134,\\\"y\\\":110}},{\\\"id\\\":\\\"entity/6a657863-9940-4303-ac68-4cc10d3078ec\\\",\\\"position\\\":{\\\"x\\\":625.0001373023756,\\\"y\\\":110}},{\\\"id\\\":\\\"entity/7ef6dd8e-5ad3-47d6-951f-681adcf2171c\\\",\\\"position\\\":{\\\"x\\\":995.0002519718007,\\\"y\\\":390}},{\\\"id\\\":\\\"entity/da165a23-2562-4a1a-b0c5-8f6e955a2e01\\\",\\\"position\\\":{\\\"x\\\":1125.0005714344913,\\\"y\\\":110}},{\\\"id\\\":\\\"venue/b7c1825b-2f25-41b7-8a39-b51b07a5bc64\\\",\\\"position\\\":{\\\"x\\\":1125.0000846706366,\\\"y\\\":220}},{\\\"id\\\":\\\"entity/e6223c6a-c150-43ea-8286-f2d6395e6d65\\\",\\\"position\\\":{\\\"x\\\":1625.0007765709465,\\\"y\\\":110}},{\\\"id\\\":\\\"entity/4002042d-b2a7-4a74-bde3-10229ab889a3\\\",\\\"position\\\":{\\\"x\\\":1455.000216347443,\\\"y\\\":426}},{\\\"id\\\":\\\"entity/c3993947-f5af-4530-9f6e-72edb767abfe\\\",\\\"position\\\":{\\\"x\\\":1625.0006288181921,\\\"y\\\":220}},{\\\"id\\\":\\\"entity/ee468f28-465d-47bc-8ffe-b02678450fd8\\\",\\\"position\\\":{\\\"x\\\":1875.0006116378358,\\\"y\\\":220}},{\\\"id\\\":\\\"device/903cb3bb24df\\\",\\\"position\\\":{\\\"x\\\":790.000930605748,\\\"y\\\":328}},{\\\"id\\\":\\\"device/68215f9d076a\\\",\\\"position\\\":{\\\"x\\\":1125.0006631675788,\\\"y\\\":330}}],\\\"zoom\\\":0.5,\\\"position\\\":[-236.25019132512296,168],\\\"rootNode\\\":\\\"entity/0000-0000-0000\\\"}\",\n \"description\": \"\",\n \"entity\": \"\",\n \"id\": \"34cfd185-da33-4885-85c7-1fef21900570\",\n \"managementPolicy\": \"\",\n \"modified\": 1654267727,\n \"name\": \"Maps from API after Edit\",\n \"notes\": [],\n \"tags\": [],\n \"venue\": \"\",\n \"visibility\": \"public\"\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/map/34cfd185-da33-4885-85c7-1fef21900570", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "map", + "34cfd185-da33-4885-85c7-1fef21900570" + ] + } + }, + "response": [] + }, + { + "name": "Delete Map", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/map/34cfd185-da33-4885-85c7-1fef21900570", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "map", + "34cfd185-da33-4885-85c7-1fef21900570" + ] + } + }, + "response": [] + }, + { + "name": "Get Management role", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/managementRole", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "managementRole" + ] + } + }, + "response": [] + }, + { + "name": "Add Management role", + "request": { + "method": "POST", + "header": [] + }, + "response": [] + }, + { + "name": "Add Operator", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"candela technologies\",\n \"deviceRules\": {\n \"rrm\": \"inherit\",\n \"rcOnly\": \"inherit\",\n \"firmwareUpgrade\": \"inherit\"\n },\n \"sourceIP\": [\n \"123.45.76.98\",\n \"123.45.76.99\",\n \"192.168.200.1\",\n \"192.168.200.3\"\n ],\n \"registrationId\": \"11220099\",\n \"description\": \"\",\n \"firmwareRCOnly\": false\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/operator/1", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "operator", + "1" + ] + } + }, + "response": [] + }, + { + "name": "Edit Operator", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"candela technologies\",\n \"description\": \"Branch\",\n \"deviceRules\": {\n \"firmwareUpgrade\": \"inherit\",\n \"rcOnly\": \"inherit\",\n \"rrm\": \"inherit\"\n },\n \"sourceIP\": [\n \"123.45.76.98\",\n \"123.45.76.99\",\n \"192.168.200.1\",\n \"192.168.200.3\"\n ],\n \"registrationId\": \"11220099\",\n \"notes\": []\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/operator/a7fffc6c-936c-4430-8f5f-1076c4d41162", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "operator", + "a7fffc6c-936c-4430-8f5f-1076c4d41162" + ] + } + }, + "response": [] + }, + { + "name": "Delete Operator", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/operator/a7fffc6c-936c-4430-8f5f-1076c4d41162", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "operator", + "a7fffc6c-936c-4430-8f5f-1076c4d41162" + ] + } + }, + "response": [] + }, + { + "name": "Get Service class", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/serviceClass?operatorId=7a10bc9d-ae9b-44fa-a699-287da5581c36", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "serviceClass" + ], + "query": [ + { + "key": "operatorId", + "value": "7a10bc9d-ae9b-44fa-a699-287da5581c36" + } + ] + } + }, + "response": [] + }, + { + "name": "Add Service class", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"Testing Purposes\",\n \"billingCode\": \"12345\",\n \"description\": \"Testing Purposes\",\n \"period\": \"monthly\",\n \"cost\": 0,\n \"currency\": \"USD\",\n \"notes\": [\n {\n \"note\": \"Testing Purposes\"\n }\n ],\n \"operatorId\": \"023227b0-ecc8-415c-9e1a-fab39541c88b\"\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/serviceClass/1", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "serviceClass", + "1" + ] + } + }, + "response": [] + }, + { + "name": "Edit Service class", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"Testing Purposes\",\n \"billingCode\": \"12345\",\n \"description\": \"Testing Purposes after editing\",\n \"period\": \"monthly\",\n \"cost\": 0,\n \"currency\": \"USD\",\n \"notes\": []\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/serviceClass/50191b05-78c3-46e0-a43e-4ee9e4c26e93", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "serviceClass", + "50191b05-78c3-46e0-a43e-4ee9e4c26e93" + ] + } + }, + "response": [] + }, + { + "name": "Delete Service class", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/serviceClass/50191b05-78c3-46e0-a43e-4ee9e4c26e93", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "serviceClass", + "50191b05-78c3-46e0-a43e-4ee9e4c26e93" + ] + } + }, + "response": [] + }, + { + "name": "Get Subscriber Device", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/subscriberDevice?operatorId=7a10bc9d-ae9b-44fa-a699-287da5581c36", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "subscriberDevice" + ], + "query": [ + { + "key": "operatorId", + "value": "7a10bc9d-ae9b-44fa-a699-287da5581c36" + } + ] + } + }, + "response": [] + }, + { + "name": "Add Subscriber device", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"operatorId\": \"7a10bc9d-ae9b-44fa-a699-287da5581c36\",\n \"billingCode\": \"11223344\",\n \"serviceClass\": \"de935aa7-211c-4300-8dcf-181bae6feb60\",\n \"note\": \"\",\n \"description\": \"\",\n \"subscriberId\": \"31bccc53-fb7d-44e9-927d-e95098083ebc\",\n \"name\": \"Candela VIzag\",\n \"deviceType\": \"cig_wf194c4\",\n \"deviceRules\": {\n \"rrm\": \"inherit\",\n \"rcOnly\": \"inherit\",\n \"firmwareUpgrade\": \"inherit\"\n },\n \"serialNumber\": \"123456712ACD\",\n \"location\": {\n \"type\": \"SERVICE\",\n \"addressLineOne\": \"Candela Technologies\",\n \"addressLineTwo\": \"\",\n \"city\": \"Visakhapatnam\",\n \"state\": \"Andhrapradesh\",\n \"postal\": \"530045\",\n \"country\": \"IN\",\n \"buildingName\": \"\",\n \"mobiles\": [],\n \"phones\": [],\n \"geoCode\": \"\",\n \"addressLines\": [\n \"Candela Technologies\"\n ]\n },\n \"contact\": {\n \"visual\": \"\",\n \"type\": \"SUBSCRIBER\",\n \"salutation\": \"\",\n \"title\": \"\",\n \"firstname\": \"Admin\",\n \"lastname\": \"\",\n \"initials\": \"\",\n \"primaryEmail\": \"candela@candelatech.com\",\n \"secondaryEmail\": \"\",\n \"mobiles\": [],\n \"phones\": [],\n \"description\": \"\",\n \"accessPIN\": \"\",\n \"note\": \"\"\n },\n \"configuration\": [\n {\n \"name\": \"Radios\",\n \"description\": \"\",\n \"weight\": 1,\n \"configuration\": {\n \"radios\": [\n {\n \"band\": \"5G\",\n \"channel\": 52,\n \"channel-mode\": \"HE\",\n \"channel-width\": 40,\n \"country\": \"CA\"\n }\n ]\n }\n },\n {\n \"name\": \"Interfaces\",\n \"description\": \"\",\n \"weight\": 1,\n \"configuration\": {\n \"interfaces\": [\n {\n \"name\": \"WAN\",\n \"role\": \"upstream\",\n \"services\": [\n \"lldp\"\n ],\n \"ethernet\": [\n {\n \"select-ports\": [\n \"WAN*\"\n ]\n }\n ],\n \"ipv4\": {\n \"addressing\": \"dynamic\"\n },\n \"ssids\": [\n {\n \"name\": \"OpenWifi\",\n \"wifi-bands\": [\n \"5G\"\n ],\n \"bss-mode\": \"ap\",\n \"encryption\": {\n \"proto\": \"psk2\",\n \"key\": \"OpenWifi\",\n \"ieee80211w\": \"optional\"\n },\n \"rate-limit\": {\n \"ingress-rate\": 20,\n \"egress-rate\": 60\n }\n }\n ]\n },\n {\n \"name\": \"LAN\",\n \"role\": \"downstream\",\n \"services\": [\n \"ssh\",\n \"lldp\"\n ],\n \"ethernet\": [\n {\n \"select-ports\": [\n \"LAN*\"\n ]\n }\n ],\n \"ipv4\": {\n \"addressing\": \"static\",\n \"subnet\": \"192.168.1.1/24\",\n \"dhcp\": {\n \"lease-first\": 10,\n \"lease-count\": 100,\n \"lease-time\": \"6h\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"Metrics\",\n \"description\": \"\",\n \"weight\": 1,\n \"configuration\": {\n \"metrics\": {\n \"statistics\": {\n \"interval\": 120,\n \"types\": [\n \"ssids\",\n \"lldp\",\n \"clients\"\n ]\n },\n \"health\": {\n \"interval\": 120\n },\n \"wifi-frames\": {\n \"filters\": [\n \"probe\",\n \"auth\"\n ]\n }\n }\n }\n },\n {\n \"name\": \"Services\",\n \"description\": \"\",\n \"weight\": 1,\n \"configuration\": {\n \"services\": {\n \"lldp\": {\n \"describe\": \"uCentral\",\n \"location\": \"universe\"\n },\n \"ssh\": {\n \"port\": 22\n }\n }\n }\n }\n ]\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/subscriberDevice/0", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "subscriberDevice", + "0" + ] + } + }, + "response": [] + }, + { + "name": "Edit Configuration", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"configuration\": [\n {\n \"configuration\": {\n \"radios\": [\n {\n \"band\": \"5G\",\n \"channel\": 52,\n \"channel-mode\": \"HE\",\n \"channel-width\": 80,\n \"country\": \"CA\"\n },\n {\n \"band\": \"2G\",\n \"channel\": 11,\n \"channel-mode\": \"HE\",\n \"channel-width\": 20,\n \"country\": \"CA\"\n }\n ]\n },\n \"description\": \"\",\n \"name\": \"Radios\",\n \"weight\": 1\n },\n {\n \"configuration\": {\n \"interfaces\": [\n {\n \"ethernet\": [\n {\n \"select-ports\": [\n \"WAN*\"\n ]\n }\n ],\n \"ipv4\": {\n \"addressing\": \"dynamic\"\n },\n \"name\": \"WAN\",\n \"role\": \"upstream\",\n \"services\": [\n \"lldp\"\n ],\n \"ssids\": [\n {\n \"bss-mode\": \"ap\",\n \"encryption\": {\n \"ieee80211w\": \"optional\",\n \"proto\": \"none\"\n },\n \"name\": \"OpenWifi\",\n \"role\": \"downstream\",\n \"wifi-bands\": [\n \"2G\",\n \"5G\"\n ]\n },\n {\n \"bss-mode\": \"ap\",\n \"encryption\": {\n \"ieee80211w\": \"optional\",\n \"key\": \"OpenWifi\",\n \"proto\": \"psk\"\n },\n \"name\": \"OpenWifi_wpa\",\n \"role\": \"downstream\",\n \"wifi-bands\": [\n \"2G\",\n \"5G\"\n ]\n },\n {\n \"bss-mode\": \"ap\",\n \"encryption\": {\n \"ieee80211w\": \"optional\",\n \"key\": \"OpenWifi\",\n \"proto\": \"psk2\"\n },\n \"name\": \"OpenWifi_wpa2\",\n \"role\": \"downstream\",\n \"wifi-bands\": [\n \"2G\",\n \"5G\"\n ]\n },\n {\n \"bss-mode\": \"ap\",\n \"encryption\": {\n \"ieee80211w\": \"optional\",\n \"key\": \"OpenWifi\",\n \"proto\": \"sae\"\n },\n \"name\": \"OpenWifi_wpa3\",\n \"role\": \"downstream\",\n \"wifi-bands\": [\n \"2G\",\n \"5G\"\n ]\n }\n ]\n },\n {\n \"ethernet\": [\n {\n \"select-ports\": [\n \"LAN*\"\n ]\n }\n ],\n \"ipv4\": {\n \"addressing\": \"static\",\n \"dhcp\": {\n \"lease-count\": 100,\n \"lease-first\": 10,\n \"lease-time\": \"6h\"\n },\n \"subnet\": \"192.168.1.1/24\"\n },\n \"name\": \"LAN\",\n \"role\": \"downstream\",\n \"services\": [\n \"ssh\",\n \"lldp\"\n ]\n }\n ]\n },\n \"description\": \"\",\n \"name\": \"Interfaces\",\n \"weight\": 1\n },\n {\n \"configuration\": {\n \"metrics\": {\n \"health\": {\n \"interval\": 120\n },\n \"statistics\": {\n \"interval\": 120,\n \"types\": [\n \"ssids\",\n \"lldp\",\n \"clients\"\n ]\n },\n \"wifi-frames\": {\n \"filters\": [\n \"probe\",\n \"auth\"\n ]\n }\n }\n },\n \"description\": \"metrics\",\n \"name\": \"Metrics\",\n \"weight\": 1\n },\n {\n \"configuration\": {\n \"services\": {\n \"lldp\": {\n \"describe\": \"uCentral\",\n \"location\": \"universe\"\n },\n \"ssh\": {\n \"port\": 22\n }\n }\n },\n \"description\": \"\",\n \"name\": \"Services\",\n \"weight\": 1\n }\n ],\n \"created\": 1654354248,\n \"description\": \"\",\n \"deviceRules\": {\n \"firmwareUpgrade\": \"inherit\",\n \"rcOnly\": \"inherit\",\n \"rrm\": \"inherit\"\n },\n \"deviceTypes\": [\n \"cig_wf188n\",\n \"edgecore_ssw2ac2600\",\n \"indio_um-305ax\",\n \"hfcl_ion4xe\",\n \"udaya_a5-id2\"\n ],\n \"entity\": \"e6223c6a-c150-43ea-8286-f2d6395e6d65\",\n \"extendedInfo\": {\n \"entity\": {\n \"description\": \"\",\n \"id\": \"e6223c6a-c150-43ea-8286-f2d6395e6d65\",\n \"name\": \"TIP LABS\"\n }\n },\n \"id\": \"60c0ae75-75df-4a10-819a-5695bf000ecf\",\n \"inUse\": [],\n \"managementPolicy\": \"\",\n \"modified\": 1654354248,\n \"name\": \"VLAN\",\n \"notes\": [],\n \"subscriber\": \"\",\n \"subscriberOnly\": false,\n \"tags\": [],\n \"variables\": [],\n \"venue\": \"\"\n}" + }, + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/configuration/60c0ae75-75df-4a10-819a-5695bf000ecf", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "configuration", + "60c0ae75-75df-4a10-819a-5695bf000ecf" + ] + } + }, + "response": [] + }, + { + "name": "Delete Configuration", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/configuration/403435b5-3501-41cf-9a68-5220c05765a3", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "configuration", + "403435b5-3501-41cf-9a68-5220c05765a3" + ] + } + }, + "response": [] + }, + { + "name": "Post System commands", + "request": { + "method": "GET", + "header": [] + }, + "response": [] + }, + { + "name": "variable", + "request": { + "method": "GET", + "header": [] + }, + "response": [] + }, + { + "name": "Dashboard", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/dashboard", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "dashboard" + ] + } + }, + "response": [] + }, + { + "name": "Live view", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/venue/c17b100d-b60b-4360-b0c4-6dee0b8e2b3a?withExtendedInfo=true", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "venue", + "c17b100d-b60b-4360-b0c4-6dee0b8e2b3a" + ], + "query": [ + { + "key": "withExtendedInfo", + "value": "true" + } + ] + } + }, + "response": [] + }, + { + "name": "Operator Location", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/operatorLocation?operatorId=7a10bc9d-ae9b-44fa-a699-287da5581c36", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "operatorLocation" + ], + "query": [ + { + "key": "operatorId", + "value": "7a10bc9d-ae9b-44fa-a699-287da5581c36" + } + ] + } + }, + "response": [] + }, + { + "name": "Peak Bandwidth", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/peakbandwidth", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "peakbandwidth" + ] + } + }, + "response": [] + }, + { + "name": "Specific Map", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/map/33838256-2a51-41cc-a1af-d5fa5974a025", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "map", + "33838256-2a51-41cc-a1af-d5fa5974a025" + ] + } + }, + "response": [] + }, + { + "name": "Specific Operator", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/operator/aa82244c-3de6-4b76-9eec-fa7e8b835fca", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "operator", + "aa82244c-3de6-4b76-9eec-fa7e8b835fca" + ] + } + }, + "response": [] + }, + { + "name": "specific service class", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{PROVISIONING_HOSTNAME}}:{{PROVISIONING_PORTNUMBER}}/api/v1/serviceClass/3c7d4b1e-d0af-4e73-acb4-76283bd26ede", + "protocol": "https", + "host": [ + "{{PROVISIONING_HOSTNAME}}" + ], + "port": "{{PROVISIONING_PORTNUMBER}}", + "path": [ + "api", + "v1", + "serviceClass", + "3c7d4b1e-d0af-4e73-acb4-76283bd26ede" + ] + } + }, + "response": [] + } + ], + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "console.log(pm.collectionVariables.get(\"ACCESS_TOKEN\"));" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "pm.test(\"Status test\", function () {", + " pm.response.to.have.status(200);", + "});", + "" + ] + } + } + ] + }, + { + "name": "Analytics", + "item": [ + { + "name": "Create Board", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "tokenType", + "value": "", + "type": "string" + }, + { + "key": "accessToken", + "value": "3946f9661872ce03cb744f1993575451300e65262d10abc8bf18147f13d7ddfa", + "type": "string" + }, + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "x-api-key", + "value": "3946f9661872ce03cb744f1993575451300e65262d10abc8bf18147f13d7ddfa", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"allOf\": {\n \"id\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n \"name\": \"board-anil\",\n \"description\": \"board-api-test\",\n \"notes\": [\n {\n \"created\": 0,\n \"createdBy\": \"anil\",\n \"note\": \"this is to test api\"\n }\n ],\n \"created\": 0,\n \"modified\": 0,\n \"tags\": [\n 0\n ]\n },\n \"venueList\": [\n {\n \"id\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n \"name\": \"test-anil-venue\",\n \"description\": \"test-lab-anil\",\n \"retention\": 0,\n \"interval\": 0,\n \"monitorSubVenues\": true\n }\n ]\n}" + }, + "url": { + "raw": "https://{{ANALYTICS_HOSTNAME}}:{{ANALYTICS_PORTNUMBER}}/api/v1/board/0", + "protocol": "https", + "host": [ + "{{ANALYTICS_HOSTNAME}}" + ], + "port": "{{ANALYTICS_PORTNUMBER}}", + "path": [ + "api", + "v1", + "board", + "0" + ] + } + }, + "response": [] + }, + { + "name": "Retrieve Board", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "tokenType", + "value": "", + "type": "string" + }, + { + "key": "accessToken", + "value": "4a42f9d4f86df135a8700d4ea1ca2c4e7105df48ca02d6eb8912141c8b2a3d82", + "type": "string" + }, + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "x-api-key", + "value": "3946f9661872ce03cb744f1993575451300e65262d10abc8bf18147f13d7ddfa", + "type": "text" + } + ], + "url": { + "raw": "https://{{ANALYTICS_HOSTNAME}}:{{ANALYTICS_PORTNUMBER}}/api/v1/board/c5d273cd-a025-4107-ae11-0dd8160a3bb0", + "protocol": "https", + "host": [ + "{{ANALYTICS_HOSTNAME}}" + ], + "port": "{{ANALYTICS_PORTNUMBER}}", + "path": [ + "api", + "v1", + "board", + "c5d273cd-a025-4107-ae11-0dd8160a3bb0" + ] + } + }, + "response": [] + }, + { + "name": "Remove Board", + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "https://{{ANALYTICS_HOSTNAME}}:{{ANALYTICS_PORTNUMBER}}/api/v1/board/a2ed3f13-ede3-4c9f-b1b0-ae92c87c896c", + "protocol": "https", + "host": [ + "{{ANALYTICS_HOSTNAME}}" + ], + "port": "{{ANALYTICS_PORTNUMBER}}", + "path": [ + "api", + "v1", + "board", + "a2ed3f13-ede3-4c9f-b1b0-ae92c87c896c" + ] + } + }, + "response": [] + }, + { + "name": "Update Board", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "tokenType", + "value": "", + "type": "string" + }, + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"allOf\": {\n \"id\": \"005ddb54-246b-41a7-b004-d0318f7b8633\",\n \"name\": \"test-board\",\n \"description\": \"board updated\",\n \"notes\": [\n {\n \"created\": 0,\n \"createdBy\": \"string\",\n \"note\": \"string\"\n }\n ],\n \"created\": 0,\n \"modified\": 0,\n \"tags\": [\n 0\n ]\n },\n \"venueList\": [\n {\n \"id\": \"005ddb54-246b-41a7-b004-d0318f7b8633\",\n \"name\": \"test-anil\",\n \"description\": \"test through postman\",\n \"retention\": 0,\n \"interval\": 0,\n \"monitorSubVenues\": true\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://{{ANALYTICS_HOSTNAME}}:{{ANALYTICS_PORTNUMBER}}/api/v1/board/005ddb54-246b-41a7-b004-d0318f7b8633", + "protocol": "https", + "host": [ + "{{ANALYTICS_HOSTNAME}}" + ], + "port": "{{ANALYTICS_PORTNUMBER}}", + "path": [ + "api", + "v1", + "board", + "005ddb54-246b-41a7-b004-d0318f7b8633" + ] + } + }, + "response": [] + }, + { + "name": "Retrieve Boards", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "tokenType", + "value": "", + "type": "string" + }, + { + "key": "accessToken", + "value": "3946f9661872ce03cb744f1993575451300e65262d10abc8bf18147f13d7ddfa", + "type": "string" + }, + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{ANALYTICS_HOSTNAME}}:{{ANALYTICS_PORTNUMBER}}/api/v1/boards", + "protocol": "https", + "host": [ + "{{ANALYTICS_HOSTNAME}}" + ], + "port": "{{ANALYTICS_PORTNUMBER}}", + "path": [ + "api", + "v1", + "boards" + ] + } + }, + "response": [] + }, + { + "name": "Board Devices", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "id", + "value": "38b2492e-23e0-4ac7-873f-7a09ca9d9de6", + "type": "text", + "disabled": true + } + ], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "id", + "value": "50adc319-1277-40b1-a47c-e7e19acd3885", + "type": "text" + } + ] + }, + "url": { + "raw": "https://{{ANALYTICS_HOSTNAME}}:{{ANALYTICS_PORTNUMBER}}/api/v1/board/a38faf03-3dce-4658-9cf4-8cc97c56c808/devices", + "protocol": "https", + "host": [ + "{{ANALYTICS_HOSTNAME}}" + ], + "port": "{{ANALYTICS_PORTNUMBER}}", + "path": [ + "api", + "v1", + "board", + "a38faf03-3dce-4658-9cf4-8cc97c56c808", + "devices" + ] + } + }, + "response": [] + }, + { + "name": "Board Data with time points", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "tokenType", + "value": "", + "type": "string" + }, + { + "key": "accessToken", + "value": "4ed313e444a6c13fe9ad7462aeb619422cb3ffee7d0b16872a765662984576b8", + "type": "string" + }, + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{ANALYTICS_HOSTNAME}}:{{ANALYTICS_PORTNUMBER}}/api/v1/board/9e522d40-4c4e-45a0-9818-accfa53949cb/timepoints?fromDate=1656433571&endDate=1656437171", + "protocol": "https", + "host": [ + "{{ANALYTICS_HOSTNAME}}" + ], + "port": "{{ANALYTICS_PORTNUMBER}}", + "path": [ + "api", + "v1", + "board", + "9e522d40-4c4e-45a0-9818-accfa53949cb", + "timepoints" + ], + "query": [ + { + "key": "fromDate", + "value": "1656433571" + }, + { + "key": "endDate", + "value": "1656437171" + } + ] + } + }, + "response": [] + }, + { + "name": "Remove Board Data with time points", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "tokenType", + "value": "", + "type": "string" + }, + { + "key": "accessToken", + "value": "4ed313e444a6c13fe9ad7462aeb619422cb3ffee7d0b16872a765662984576b8", + "type": "string" + }, + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [], + "url": { + "raw": "https://{{ANALYTICS_HOSTNAME}}:{{ANALYTICS_PORTNUMBER}}/api/v1/board/9e522d40-4c4e-45a0-9818-accfa53949cb/timepoints?fromDate=1656433571&endDate=1656437171", + "protocol": "https", + "host": [ + "{{ANALYTICS_HOSTNAME}}" + ], + "port": "{{ANALYTICS_PORTNUMBER}}", + "path": [ + "api", + "v1", + "board", + "9e522d40-4c4e-45a0-9818-accfa53949cb", + "timepoints" + ], + "query": [ + { + "key": "fromDate", + "value": "1656433571" + }, + { + "key": "endDate", + "value": "1656437171" + } + ] + } + }, + "response": [] + }, + { + "name": "Retrieve All wifiClientHistory", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "tokenType", + "value": "", + "type": "string" + }, + { + "key": "accessToken", + "value": "c2001fefe7b79544306697585b63c30af1b834e40f6bc2b066bd737294cc17b1", + "type": "string" + }, + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "id", + "value": "38b2492e-23e0-4ac7-873f-7a09ca9d9de6", + "type": "text", + "disabled": true + } + ], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "id", + "value": "38b2492e-23e0-4ac7-873f-7a09ca9d9de6", + "type": "text" + } + ] + }, + "url": { + "raw": "https://{{ANALYTICS_HOSTNAME}}:{{ANALYTICS_PORTNUMBER}}/api/v1/wifiClientHistory?macsOnly=true&venue=cc21fda9-0dc5-4def-85f3-045aa796d6d0", + "protocol": "https", + "host": [ + "{{ANALYTICS_HOSTNAME}}" + ], + "port": "{{ANALYTICS_PORTNUMBER}}", + "path": [ + "api", + "v1", + "wifiClientHistory" + ], + "query": [ + { + "key": "macsOnly", + "value": "true" + }, + { + "key": "venue", + "value": "cc21fda9-0dc5-4def-85f3-045aa796d6d0" + } + ] + } + }, + "response": [] + }, + { + "name": "Retrieve a wifiClientHistory", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "tokenType", + "value": "", + "type": "string" + }, + { + "key": "accessToken", + "value": "c2001fefe7b79544306697585b63c30af1b834e40f6bc2b066bd737294cc17b1", + "type": "string" + }, + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "id", + "value": "38b2492e-23e0-4ac7-873f-7a09ca9d9de6", + "type": "text", + "disabled": true + } + ], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "id", + "value": "38b2492e-23e0-4ac7-873f-7a09ca9d9de6", + "type": "text" + } + ] + }, + "url": { + "raw": "https://{{ANALYTICS_HOSTNAME}}:{{ANALYTICS_PORTNUMBER}}/api/v1/wifiClientHistory/0?orderSpec=true", + "protocol": "https", + "host": [ + "{{ANALYTICS_HOSTNAME}}" + ], + "port": "{{ANALYTICS_PORTNUMBER}}", + "path": [ + "api", + "v1", + "wifiClientHistory", + "0" + ], + "query": [ + { + "key": "orderSpec", + "value": "true" + } + ] + } + }, + "response": [] + }, + { + "name": "Delete a wifiClientHistory", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [ + { + "key": "id", + "value": "38b2492e-23e0-4ac7-873f-7a09ca9d9de6", + "type": "text", + "disabled": true + } + ], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "id", + "value": "38b2492e-23e0-4ac7-873f-7a09ca9d9de6", + "type": "text" + } + ] + }, + "url": { + "raw": "https://{{ANALYTICS_HOSTNAME}}:{{ANALYTICS_PORTNUMBER}}/api/v1/wifiClientHistory/0?orderSpec=true", + "protocol": "https", + "host": [ + "{{ANALYTICS_HOSTNAME}}" + ], + "port": "{{ANALYTICS_PORTNUMBER}}", + "path": [ + "api", + "v1", + "wifiClientHistory", + "0" + ], + "query": [ + { + "key": "orderSpec", + "value": "true" + } + ] + } + }, + "response": [] + }, + { + "name": "GET System Info", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "tokenType", + "value": "", + "type": "string" + }, + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{ANALYTICS_HOSTNAME}}:{{ANALYTICS_PORTNUMBER}}/api/v1/system?command=info", + "protocol": "https", + "host": [ + "{{ANALYTICS_HOSTNAME}}" + ], + "port": "{{ANALYTICS_PORTNUMBER}}", + "path": [ + "api", + "v1", + "system" + ], + "query": [ + { + "key": "command", + "value": "info" + } + ] + } + }, + "response": [] + }, + { + "name": "Peform System Command", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "tokenType", + "value": "", + "type": "string" + }, + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\"command\":\"getsubsystemnames\"}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://{{ANALYTICS_HOSTNAME}}:{{ANALYTICS_PORTNUMBER}}/api/v1/system", + "protocol": "https", + "host": [ + "{{ANALYTICS_HOSTNAME}}" + ], + "port": "{{ANALYTICS_PORTNUMBER}}", + "path": [ + "api", + "v1", + "system" + ] + } + }, + "response": [] + }, + { + "name": "Get Country Code for IP", + "request": { + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://{{ANALYTICS_HOSTNAME}}:{{ANALYTICS_PORTNUMBER}}/api/v1/iptocountry?iplist=10.2.2.2", + "protocol": "https", + "host": [ + "{{ANALYTICS_HOSTNAME}}" + ], + "port": "{{ANALYTICS_PORTNUMBER}}", + "path": [ + "api", + "v1", + "iptocountry" + ], + "query": [ + { + "key": "iplist", + "value": "10.2.2.2" + } + ] + } + }, + "response": [] + } + ] + } + ], + "auth": { + "type": "oauth2", + "oauth2": [ + { + "key": "clientSecret", + "value": "SDK_SECRET", + "type": "string" + }, + { + "key": "clientId", + "value": "SDK_USER", + "type": "string" + }, + { + "key": "authUrl", + "value": "https://{{SECURITY_HOSTNAME}}:{{SECURITY_PORTNUMBER}}/api/v1/oauth2", + "type": "string" + }, + { + "key": "tokenName", + "value": "SDK_TOKEN", + "type": "string" + }, + { + "key": "addTokenTo", + "value": "header", + "type": "string" + } + ] + }, + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "server", + "value": "" + }, + { + "key": "SECURITY_HOSTNAME", + "value": "sec-qa01.cicd.lab.wlan.tip.build" + }, + { + "key": "SECURITY_PORTNUMBER", + "value": "16001" + }, + { + "key": "GATEWAY_HOSTNAME", + "value": "gw-qa01.cicd.lab.wlan.tip.build" + }, + { + "key": "GATEWAY_PORTNUMBER", + "value": "16002" + }, + { + "key": "FIRMWARE_HOSTNAME", + "value": "fms-qa01.cicd.lab.wlan.tip.build" + }, + { + "key": "FIRMWARE_PORTNUMBER", + "value": "16004" + }, + { + "key": "PROVISIONING_HOSTNAME", + "value": "prov-qa01.cicd.lab.wlan.tip.build" + }, + { + "key": "PROVISIONING_PORTNUMBER", + "value": "16005" + }, + { + "key": "BEARERTOKEN", + "value": "BEARERTOKEN", + "type": "string" + }, + { + "key": "SDK_USER", + "value": "tip@ucentral.com", + "type": "string" + }, + { + "key": "SDK_SECRET", + "value": "OpenWiFi%123", + "type": "string" + }, + { + "key": "SERIAL", + "value": "00037f941710", + "type": "string" + }, + { + "key": "ACCESS_TOKEN\n", + "value": "ACCESS_TOKEN", + "type": "string" + }, + { + "key": "ACCESS_TOKEN", + "value": "" + }, + { + "key": "object", + "value": "createObjects" + }, + { + "key": "ANALYTICS_HOSTNAME", + "value": "analytics-qa01.cicd.lab.wlan.tip.build", + "type": "string" + }, + { + "key": "ANALYTICS_PORTNUMBER", + "value": "16009", + "type": "string" + } + ] +} \ No newline at end of file diff --git a/.gitbook/assets/image (1).png b/.gitbook/assets/image (1).png new file mode 100644 index 0000000..986ec96 Binary files /dev/null and b/.gitbook/assets/image (1).png differ diff --git a/.gitbook/assets/image (2).png b/.gitbook/assets/image (2).png new file mode 100644 index 0000000..60c0878 Binary files /dev/null and b/.gitbook/assets/image (2).png differ diff --git a/.gitbook/assets/image (22) (2).png b/.gitbook/assets/image (22) (2).png new file mode 100644 index 0000000..69ddbdf Binary files /dev/null and b/.gitbook/assets/image (22) (2).png differ diff --git a/.gitbook/assets/image (22).png b/.gitbook/assets/image (22).png new file mode 100644 index 0000000..96972e4 Binary files /dev/null and b/.gitbook/assets/image (22).png differ diff --git a/.gitbook/assets/image (23).png b/.gitbook/assets/image (23).png new file mode 100644 index 0000000..9a83ab8 Binary files /dev/null and b/.gitbook/assets/image (23).png differ diff --git a/.gitbook/assets/image (24).png b/.gitbook/assets/image (24).png new file mode 100644 index 0000000..b96313e Binary files /dev/null and b/.gitbook/assets/image (24).png differ diff --git a/.gitbook/assets/image (28).png b/.gitbook/assets/image (28).png new file mode 100644 index 0000000..368bfa8 Binary files /dev/null and b/.gitbook/assets/image (28).png differ diff --git a/.gitbook/assets/image (29).png b/.gitbook/assets/image (29).png new file mode 100644 index 0000000..29e791a Binary files /dev/null and b/.gitbook/assets/image (29).png differ diff --git a/.gitbook/assets/image (3).png b/.gitbook/assets/image (3).png new file mode 100644 index 0000000..0838ba0 Binary files /dev/null and b/.gitbook/assets/image (3).png differ diff --git a/.gitbook/assets/image (30) (1).png b/.gitbook/assets/image (30) (1).png new file mode 100644 index 0000000..69ddbdf Binary files /dev/null and b/.gitbook/assets/image (30) (1).png differ diff --git a/.gitbook/assets/image (31).png b/.gitbook/assets/image (31).png new file mode 100644 index 0000000..4777e74 Binary files /dev/null and b/.gitbook/assets/image (31).png differ diff --git a/.gitbook/assets/image (32) (1).png b/.gitbook/assets/image (32) (1).png new file mode 100644 index 0000000..c2ed39c Binary files /dev/null and b/.gitbook/assets/image (32) (1).png differ diff --git a/.gitbook/assets/image (32).png b/.gitbook/assets/image (32).png new file mode 100644 index 0000000..c2ed39c Binary files /dev/null and b/.gitbook/assets/image (32).png differ diff --git a/.gitbook/assets/image (33) (1).png b/.gitbook/assets/image (33) (1).png new file mode 100644 index 0000000..186b914 Binary files /dev/null and b/.gitbook/assets/image (33) (1).png differ diff --git a/.gitbook/assets/image (33).png b/.gitbook/assets/image (33).png new file mode 100644 index 0000000..186b914 Binary files /dev/null and b/.gitbook/assets/image (33).png differ diff --git a/.gitbook/assets/image (36) (1).png b/.gitbook/assets/image (36) (1).png new file mode 100644 index 0000000..c129761 Binary files /dev/null and b/.gitbook/assets/image (36) (1).png differ diff --git a/.gitbook/assets/image (36).png b/.gitbook/assets/image (36).png new file mode 100644 index 0000000..c129761 Binary files /dev/null and b/.gitbook/assets/image (36).png differ diff --git a/.gitbook/assets/image (5).png b/.gitbook/assets/image (5).png new file mode 100644 index 0000000..586a7b8 Binary files /dev/null and b/.gitbook/assets/image (5).png differ diff --git a/.gitbook/assets/image.png b/.gitbook/assets/image.png new file mode 100644 index 0000000..0838ba0 Binary files /dev/null and b/.gitbook/assets/image.png differ diff --git a/.gitbook/assets/image1.jpeg b/.gitbook/assets/image1.jpeg new file mode 100644 index 0000000..81430e4 Binary files /dev/null and b/.gitbook/assets/image1.jpeg differ diff --git a/.gitbook/assets/image10.png b/.gitbook/assets/image10.png new file mode 100644 index 0000000..6695f57 Binary files /dev/null and b/.gitbook/assets/image10.png differ diff --git a/.gitbook/assets/image11.jpeg b/.gitbook/assets/image11.jpeg new file mode 100644 index 0000000..f902579 Binary files /dev/null and b/.gitbook/assets/image11.jpeg differ diff --git a/.gitbook/assets/image12.jpeg b/.gitbook/assets/image12.jpeg new file mode 100644 index 0000000..e1842ee Binary files /dev/null and b/.gitbook/assets/image12.jpeg differ diff --git a/.gitbook/assets/image13.png b/.gitbook/assets/image13.png new file mode 100644 index 0000000..4fecc54 Binary files /dev/null and b/.gitbook/assets/image13.png differ diff --git a/.gitbook/assets/image14.png b/.gitbook/assets/image14.png new file mode 100644 index 0000000..b8d7987 Binary files /dev/null and b/.gitbook/assets/image14.png differ diff --git a/.gitbook/assets/image15.jpeg b/.gitbook/assets/image15.jpeg new file mode 100644 index 0000000..569e69a Binary files /dev/null and b/.gitbook/assets/image15.jpeg differ diff --git a/.gitbook/assets/image16.png b/.gitbook/assets/image16.png new file mode 100644 index 0000000..b636e6e Binary files /dev/null and b/.gitbook/assets/image16.png differ diff --git a/.gitbook/assets/image17.png b/.gitbook/assets/image17.png new file mode 100644 index 0000000..c9648d6 Binary files /dev/null and b/.gitbook/assets/image17.png differ diff --git a/.gitbook/assets/image18.png b/.gitbook/assets/image18.png new file mode 100644 index 0000000..0497ca7 Binary files /dev/null and b/.gitbook/assets/image18.png differ diff --git a/.gitbook/assets/image19.png b/.gitbook/assets/image19.png new file mode 100644 index 0000000..2073866 Binary files /dev/null and b/.gitbook/assets/image19.png differ diff --git a/.gitbook/assets/image2.png b/.gitbook/assets/image2.png new file mode 100644 index 0000000..ed018cc Binary files /dev/null and b/.gitbook/assets/image2.png differ diff --git a/.gitbook/assets/image20.png b/.gitbook/assets/image20.png new file mode 100644 index 0000000..587ebc9 Binary files /dev/null and b/.gitbook/assets/image20.png differ diff --git a/.gitbook/assets/image21.png b/.gitbook/assets/image21.png new file mode 100644 index 0000000..50877ee Binary files /dev/null and b/.gitbook/assets/image21.png differ diff --git a/.gitbook/assets/image22.png b/.gitbook/assets/image22.png new file mode 100644 index 0000000..23a071c Binary files /dev/null and b/.gitbook/assets/image22.png differ diff --git a/.gitbook/assets/image23.jpeg b/.gitbook/assets/image23.jpeg new file mode 100644 index 0000000..5f75c5d Binary files /dev/null and b/.gitbook/assets/image23.jpeg differ diff --git a/.gitbook/assets/image24.jpeg b/.gitbook/assets/image24.jpeg new file mode 100644 index 0000000..c3e6845 Binary files /dev/null and b/.gitbook/assets/image24.jpeg differ diff --git a/.gitbook/assets/image25.jpeg b/.gitbook/assets/image25.jpeg new file mode 100644 index 0000000..59f5bd3 Binary files /dev/null and b/.gitbook/assets/image25.jpeg differ diff --git a/.gitbook/assets/image26.jpeg b/.gitbook/assets/image26.jpeg new file mode 100644 index 0000000..31473b4 Binary files /dev/null and b/.gitbook/assets/image26.jpeg differ diff --git a/.gitbook/assets/image27.jpeg b/.gitbook/assets/image27.jpeg new file mode 100644 index 0000000..7d1efbb Binary files /dev/null and b/.gitbook/assets/image27.jpeg differ diff --git a/.gitbook/assets/image28.png b/.gitbook/assets/image28.png new file mode 100644 index 0000000..1565b3e Binary files /dev/null and b/.gitbook/assets/image28.png differ diff --git a/.gitbook/assets/image29.png b/.gitbook/assets/image29.png new file mode 100644 index 0000000..4ed43a8 Binary files /dev/null and b/.gitbook/assets/image29.png differ diff --git a/.gitbook/assets/image3.png b/.gitbook/assets/image3.png new file mode 100644 index 0000000..7cd8d47 Binary files /dev/null and b/.gitbook/assets/image3.png differ diff --git a/.gitbook/assets/image30.png b/.gitbook/assets/image30.png new file mode 100644 index 0000000..81153dc Binary files /dev/null and b/.gitbook/assets/image30.png differ diff --git a/.gitbook/assets/image31.png b/.gitbook/assets/image31.png new file mode 100644 index 0000000..ce38614 Binary files /dev/null and b/.gitbook/assets/image31.png differ diff --git a/.gitbook/assets/image4.png b/.gitbook/assets/image4.png new file mode 100644 index 0000000..8a0bcf4 Binary files /dev/null and b/.gitbook/assets/image4.png differ diff --git a/.gitbook/assets/image5.png b/.gitbook/assets/image5.png new file mode 100644 index 0000000..6d088ca Binary files /dev/null and b/.gitbook/assets/image5.png differ diff --git a/.gitbook/assets/image6.png b/.gitbook/assets/image6.png new file mode 100644 index 0000000..1ea8a34 Binary files /dev/null and b/.gitbook/assets/image6.png differ diff --git a/.gitbook/assets/image7.png b/.gitbook/assets/image7.png new file mode 100644 index 0000000..c96b0e3 Binary files /dev/null and b/.gitbook/assets/image7.png differ diff --git a/.gitbook/assets/image8.png b/.gitbook/assets/image8.png new file mode 100644 index 0000000..f902aa2 Binary files /dev/null and b/.gitbook/assets/image8.png differ diff --git a/.gitbook/assets/image9.png b/.gitbook/assets/image9.png new file mode 100644 index 0000000..349a925 Binary files /dev/null and b/.gitbook/assets/image9.png differ diff --git a/.gitbook/assets/kafka-ELK-pipeline.png b/.gitbook/assets/kafka-ELK-pipeline.png new file mode 100644 index 0000000..37b3e95 Binary files /dev/null and b/.gitbook/assets/kafka-ELK-pipeline.png differ diff --git a/.gitbook/assets/kibana-2.png b/.gitbook/assets/kibana-2.png new file mode 100644 index 0000000..6790002 Binary files /dev/null and b/.gitbook/assets/kibana-2.png differ diff --git a/.gitbook/assets/kibana.png b/.gitbook/assets/kibana.png new file mode 100644 index 0000000..ea23c4d Binary files /dev/null and b/.gitbook/assets/kibana.png differ diff --git a/.gitbook/assets/owanalytics.yaml b/.gitbook/assets/owanalytics.yaml new file mode 100644 index 0000000..b7ccb84 --- /dev/null +++ b/.gitbook/assets/owanalytics.yaml @@ -0,0 +1,1409 @@ +openapi: 3.0.1 +info: + title: OpenWiFi Analytics Service + description: Definitions and APIs to analyze OpenWiFi network. + version: 2.6.0 + license: + name: BSD3 + url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE + +servers: + - url: 'https://localhost:16009/api/v1' + +security: + - bearerAuth: [] + - ApiKeyAuth: [] + +components: + securitySchemes: + ApiKeyAuth: + type: apiKey + in: header + name: X-API-KEY + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + + responses: + NotFound: + description: The specified resource was not found. + content: + application/json: + schema: + properties: + ErrorCode: + type: integer + ErrorDetails: + type: string + ErrorDescription: + type: string + + Unauthorized: + description: The requested does not have sufficient rights to perform the operation. + content: + application/json: + schema: + properties: + ErrorCode: + type: integer + enum: + - 0 # Success + - 1 # PASSWORD_CHANGE_REQUIRED, + - 2 # INVALID_CREDENTIALS, + - 3 # PASSWORD_ALREADY_USED, + - 4 # USERNAME_PENDING_VERIFICATION, + - 5 # PASSWORD_INVALID, + - 6 # INTERNAL_ERROR, + - 7 # ACCESS_DENIED, + - 8 # INVALID_TOKEN + - 9 # EXPIRED_TOKEN + - 10 # RATE_LIMIT_EXCEEDED + - 11 # BAD_MFA_TRANSACTION + - 12 # MFA_FAILURE + - 13 # SECURITY_SERVICE_UNREACHABLE + ErrorDetails: + type: string + ErrorDescription: + type: string + + Success: + description: The requested operation was performed. + content: + application/json: + schema: + properties: + Operation: + type: string + Details: + type: string + Code: + type: integer + + BadRequest: + description: The requested operation failed. + content: + application/json: + schema: + properties: + ErrorCode: + type: integer + ErrorDetails: + type: string + ErrorDescription: + type: integer + + schemas: + ObjectInfo: + type: object + properties: + id: + type: string + format: uuid + name: + type: string + description: + type: string + notes: + type: array + items: + $ref: '#/components/schemas/NoteInfo' + created: + type: integer + format: int64 + modified: + type: integer + format: int64 + tags: + type: array + items: + type: integer + format: int64 + + VenueInfo: + type: object + properties: + id: + type: string + format: uuid + name: + type: string + description: + type: string + retention: + type: integer + interval: + type: integer + monitorSubVenues: + type: boolean + + BoardInfo: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + venueList: + type: array + items: + $ref: '#/components/schemas/VenueInfo' + + BoardInfoList: + type: object + properties: + boards: + type: array + items: + $ref: '#/components/schemas/BoardInfo' + + DeviceInfo: + type: object + properties: + type: + type: string + enum: + - ap + - switch + - iot + - unknown + serialNumber: + type: string + deviceType: + type: string + lastHealth: + type: integer + format: int64 + health: + type: integer + format: int64 + lastContact: + type: integer + format: int64 + lastPing: + type: integer + format: int64 + lastState: + type: integer + format: int64 + lastFirmwareUpdate: + type: integer + format: int64 + lastFirmware: + type: string + lastConnection: + type: integer + format: int64 + lastDisconnection: + type: integer + format: int64 + pings: + type: integer + format: int64 + states: + type: integer + format: int64 + connected: + type: boolean + connectionIp: + type: string + associations_2g: + type: integer + format: int64 + associations_5g: + type: integer + format: int64 + associations_6g: + type: integer + format: int64 + locale: + type: string + memory: + type: number + uptime: + type: integer + format: int64 + + DeviceInfoList: + type: object + properties: + devices: + type: array + items: + $ref: '#/components/schemas/DeviceInfo' + + TIDstat_entry: + type: object + properties: + rx_msdu: + type: integer + format: int64 + tx_msdu: + type: integer + format: int64 + tx_msdu_failed: + type: integer + format: int64 + tx_msdu_retries: + type: integer + format: int64 + + UE_rate: + type: object + properties: + bitrate: + type: integer + format: int64 + mcs: + type: integer + format: int64 + nss: + type: integer + format: int64 + chwidth: + type: integer + format: int64 + ht: + type: boolean + sgi: + type: + boolean + + UETimePoint: + type: object + properties: + association_bssid: + type: integer + format: int64 + station: + type: integer + format: int64 + rssi: + type: integer + format: int64 + tx_bytes: + type: integer + format: int64 + rx_bytes: + type: integer + format: int64 + tx_duration: + type: integer + format: int64 + rx_packets: + type: integer + format: int64 + tx_packets: + type: integer + format: int64 + tx_retries: + type: integer + format: int64 + tx_failed: + type: integer + format: int64 + connected: + type: integer + format: int64 + inactive: + type: integer + format: int64 + tx_rate: + $ref: '#/components/schemas/UE_rate' + rx_rate: + $ref: '#/components/schemas/UE_rate' + tidstats: + type: array + items: + $ref: '#/components/schemas/TIDstat_entry' + tx_bytes_bw: + type: number + rx_bytes_bw: + type: number + tx_packets_bw: + type: number + rx_packets_bw: + type: number + tx_failed_pct: + type: number + tx_retries_pct: + type: number + tx_duration_pct: + type: number + tx_bytes_delta: + type: integer + format: int64 + rx_bytes_delta: + type: integer + format: int64 + tx_packets_delta: + type: integer + format: int64 + rx_packets_delta: + type: integer + format: int64 + tx_failed_delta: + type: integer + format: int64 + tx_retries_delta: + type: integer + format: int64 + tx_duration_delta: + type: integer + format: int64 + + AveragePoint: + type: object + properties: + min: + type: number + max: + type: number + avg: + type: number + + SSIDTimePoint: + type: object + properties: + bssid: + type: string + mode: + type: string + ssid: + type: string + band: + type: integer + associations: + type: array + items: + $ref: '#/components/schemas/UETimePoint' + tx_bytes_bw: + $ref: '#/components/schemas/AveragePoint' + rx_bytes_bw: + $ref: '#/components/schemas/AveragePoint' + tx_packets_bw: + $ref: '#/components/schemas/AveragePoint' + rx_packets_bw: + $ref: '#/components/schemas/AveragePoint' + tx_failed_pct: + $ref: '#/components/schemas/AveragePoint' + tx_retries_pct: + $ref: '#/components/schemas/AveragePoint' + tx_duration_pct: + $ref: '#/components/schemas/AveragePoint' + + APTimePoint: + type: object + properties: + collisions: + type: integer + format: int64 + multicast: + type: integer + format: int64 + rx_bytes: + type: integer + format: int64 + rx_dropped: + type: integer + format: int64 + rx_errors: + type: integer + format: int64 + rx_packets: + type: integer + format: int64 + tx_bytes: + type: integer + format: int64 + tx_dropped: + type: integer + format: int64 + tx_errors: + type: integer + format: int64 + tx_packets: + type: integer + format: int64 + tx_bytes_delta: + type: integer + format: int64 + rx_bytes_delta: + type: integer + format: int64 + rx_dropped_delta: + type: integer + format: int64 + tx_dropped_delta: + type: integer + format: int64 + rx_packets_delta: + type: integer + format: int64 + tx_packets_delta: + type: integer + format: int64 + rx_errors_delta: + type: integer + format: int64 + tx_errors_delta: + type: integer + format: int64 + + RadioTimePoint: + type: object + properties: + band: + type: integer + format: int64 + radio_channel: + type: integer + format: int64 + active_ms: + type: integer + format: int64 + busy_ms: + type: integer + format: int64 + receive_ms: + type: integer + format: int64 + transmit_ms: + type: integer + format: int64 + tx_power: + type: integer + format: int64 + channel: + type: integer + format: int64 + temperature: + type: integer + format: int64 + noise: + type: integer + format: int64 + active_pct: + type: number + busy_pct: + type: number + receive_pct: + type: number + transmit_pct: + type: number + + DeviceTimePoint: + type: object + properties: + id: + type: string + format: uuid + boardId: + type: string + format: uuid + serialNumber: + type: string + timestamp: + type: integer + format: int64 + ap_data: + $ref: '#/components/schemas/APTimePoint' + ssid_data: + type: array + items: + $ref: '#/components/schemas/SSIDTimePoint' + radio_data: + type: array + items: + $ref: '#/components/schemas/RadioTimePoint' + device_info: + $ref: '#/components/schemas/DeviceInfo' + + DeviceTimePointAnalysis: + type: object + properties: + timestamp: + type: integer + format: int64 + noise: + $ref: '#/components/schemas/AveragePoint' + active_pct: + $ref: '#/components/schemas/AveragePoint' + busy_pct: + $ref: '#/components/schemas/AveragePoint' + receive_pct: + $ref: '#/components/schemas/AveragePoint' + transmit_pct: + $ref: '#/components/schemas/AveragePoint' + tx_power: + $ref: '#/components/schemas/AveragePoint' + tx_bytes_bw: + $ref: '#/components/schemas/AveragePoint' + rx_bytes_bw: + $ref: '#/components/schemas/AveragePoint' + rx_dropped_pct: + $ref: '#/components/schemas/AveragePoint' + tx_dropped_pct: + $ref: '#/components/schemas/AveragePoint' + rx_packets_bw: + $ref: '#/components/schemas/AveragePoint' + tx_packets_bw: + $ref: '#/components/schemas/AveragePoint' + rx_errors_pct: + $ref: '#/components/schemas/AveragePoint' + tx_errors_pct: + $ref: '#/components/schemas/AveragePoint' + + DeviceTimePointList: + type: object + properties: + points: + type: array + items: + $ref: '#/components/schemas/DeviceTimePoint' + stats: + type: array + items: + $ref: '#/components/schemas/DeviceTimePointAnalysis' + + DeviceTimePointStats: + type: object + properties: + firstPoint: + type: integer + format: int64 + lastPoint: + type: integer + format: int64 + count: + type: integer + format: int64 + + WifiClientHistory: + type: object + properties: + timestamp: + type: integer + station_id: + type: string + bssid: + type: string + ssid: + type: string + rssi: + type: integer + rx_bitrate: + type: integer + rx_chwidth: + type: integer + rx_mcs: + type: integer + rx_nss: + type: integer + rx_vht: + type: boolean + tx_bitrate: + type: integer + tx_chwidth: + type: integer + tx_mcs: + type: integer + tx_nss: + type: integer + tx_vht: + type: boolean + rx_bytes: + type: integer + tx_bytes: + type: integer + rx_duration: + type: integer + tx_duration: + type: integer + rx_packets: + type: integer + tx_packets: + type: integer + ipv4: + type: string + ipv6: + type: string + channel_width: + type: integer + noise: + type: integer + tx_power: + type: integer + channel: + type: integer + active_ms: + type: integer + busy_ms: + type: integer + receive_ms: + type: integer + mode: + type: string + ack_signal: + type: integer + ack_signal_avg: + type: integer + connected: + type: integer + inactive: + type: integer + tx_retries: + type: integer + venue_id: + type: string + + WifiClientHistoryList: + type: object + properties: + entries: + type: array + items: + $ref: '#/components/schemas/WifiClientHistory' + + MacList: + type: object + properties: + entries: + type: array + items: + type: string + + ######################################################################################### + ## + ## These are endpoints that all services in the OPenWiFI stack must provide + ## + ######################################################################################### + AnyPayload: + type: object + properties: + Document: + type: string + + StringList: + type: object + properties: + list: + type: array + items: + type: string + + TagValuePair: + type: object + properties: + tag: + type: string + value: + type: string + + TagValuePairList: + type: object + properties: + tagList: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + TagIntPair: + type: object + properties: + tag: + type: string + value: + type: integer + format: int64 + + TagIntPairList: + type: object + properties: + tagList: + type: array + items: + $ref: '#/components/schemas/TagIntPair' + + SystemCommandDetails: + type: object + properties: + command: + type: string + enum: + - setloglevels + - getloglevels + - getSubSystemNames + - getLogLevelNames + - stats + parameters: + oneOf: + - $ref: '#/components/schemas/StringList' + - $ref: '#/components/schemas/TagValuePairList' + + SystemCommandResults: + type: object + oneOf: + - $ref: '#/components/schemas/StringList' + - $ref: '#/components/schemas/TagValuePairList' + + NoteInfo: + type: object + properties: + created: + type: integer + format: int64 + createdBy: + type: string + note: + type: string + + SystemInfoResults: + type: object + properties: + version: + type: string + uptime: + type: integer + format: integer64 + start: + type: integer + format: integer64 + os: + type: string + processors: + type: integer + hostname: + type: string + certificates: + type: array + items: + type: object + properties: + filename: + type: string + expires: + type: integer + format: int64 + + Dashboard: + type: object + properties: + snapshot: + type: integer + format: int64 + tenants: + $ref: '#/components/schemas/TagIntPairList' + + SystemCommandSetLogLevel: + type: object + properties: + command: + type: string + enum: + - setloglevel + subsystems: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + SystemCommandReload: + type: object + properties: + command: + type: string + enum: + - reload + subsystems: + type: array + items: + type: string + example: these are the SubSystems names retrieve with the GetSubSystemsNamesResult. + + SystemCommandGetLogLevels: + type: object + properties: + command: + type: string + enum: + - getloglevels + + SystemGetLogLevelsResult: + type: object + properties: + taglist: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + SystemCommandGetLogLevelNames: + type: object + properties: + command: + type: string + enum: + - getloglevelnames + + SystemCommandGetSubsystemNames: + type: object + properties: + command: + type: string + enum: + - getsubsystemnames + + SystemCommandGetLogLevelNamesResult: + type: object + properties: + list: + type: array + items: + type: string + + SystemGetSubSystemNamesResult: + type: object + properties: + taglist: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + +paths: + /boards: + get: + tags: + - Boards + operationId: getBoards + summary: Retrieve a list of boards. + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: return the number of boards + name: countOnly + schema: + type: boolean + required: false + - in: query + description: list of boards for a given venue + name: forVenue + schema: + type: string + format: uuid + required: false + responses: + 200: + description: Return a list of boards + content: + application/json: + schema: + $ref: '#/components/schemas/BoardInfoList' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /board/{id}: + get: + tags: + - Boards + operationId: getBoard + summary: Retrieve a board + parameters: + - in: path + name: id + schema: + type: string + format: uuid + required: true + responses: + 200: + description: Return a list of boards + content: + application/json: + schema: + $ref: '#/components/schemas/BoardInfo' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + tags: + - Boards + operationId: deleteBoard + summary: Remove a board + parameters: + - in: path + name: id + schema: + type: string + format: uuid + required: true + responses: + 200: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + tags: + - Boards + operationId: createBoard + summary: Create a board + parameters: + - in: path + name: id + schema: + type: string + format: uuid + required: true + example: value should be 0 for a post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BoardInfo' + responses: + 200: + $ref: '#/components/schemas/BoardInfo' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + tags: + - Boards + operationId: modifyBoard + summary: Modify a board + parameters: + - in: path + name: id + schema: + type: string + format: uuid + required: true + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BoardInfo' + responses: + 200: + $ref: '#/components/schemas/BoardInfo' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /board/{id}/devices: + get: + tags: + - Board Devices + summary: Get basic information about all the devices for a venue. + operationId: getBoardDevices + parameters: + - in: path + name: id + schema: + type: string + format: uuid + required: true + + responses: + 200: + $ref: '#/components/schemas/DeviceInfoList' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /board/{id}/timepoints: + get: + tags: + - Board data + summary: retrieve board data for a given time period. + operationId: getBoardTimepoint + parameters: + - in: path + name: id + schema: + type: string + format: uuid + required: true + - in: query + name: fromDate + schema: + type: integer + required: false + - in: query + name: endDate + schema: + type: integer + required: false + - in: query + name: maxRecords + schema: + type: integer + default: 100 + required: false + - in: query + name: statsOnly + schema: + type: boolean + default: false + required: false + - in: query + name: pointsOnly + schema: + type: boolean + default: false + required: false + - in: query + name: pointsStatsOnly + schema: + type: boolean + default: false + required: false + + responses: + 200: + $ref: '#/components/schemas/DeviceTimePointList' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Board data + summary: delete board data for a given time period. + operationId: deleteBoardTimepoints + parameters: + - in: path + name: id + schema: + type: string + format: uuid + required: true + - in: query + name: fromDate + schema: + type: integer + required: false + - in: query + name: endDate + schema: + type: integer + required: false + responses: + 200: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + + /iptocountry: + get: + tags: + - Utility + summary: Get the country code for an IP address + operationId: getIpToCountry + parameters: + - in: query + name: iplist + schema: + type: string + example: + 10.2.2.2,10.3.4.3 + required: true + responses: + 200: + description: List of country codes. + content: + application/json: + schema: + type: object + properties: + enabled: + type: boolean + countryCodes: + type: array + items: + type: string + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /wifiClientHistory: + get: + tags: + - WiFiClientHistory + operationId: getWifiClientHistory + summary: Retrieve WiFi client history for debugging purpose + parameters: + - in: query + name: fromDate + schema: + type: integer + required: false + - in: query + name: endDate + schema: + type: integer + required: false + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: macsOnly + schema: + type: boolean + default: false + required: true + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: macFilter + schema: + type: string + example: + 112233445566, 11223344*, *5566 + required: false + - in: query + description: The venue to for the search. + name: venue + schema: + type: string + format: uuid + required: true + responses: + 200: + $ref: '#/components/schemas/StringList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /wifiClientHistory/{client}: + get: + tags: + - WiFiClientHistory + operationId: getWifiClients + summary: Retrieve WiFi client history for debugging purpose + parameters: + - in: path + name: client + schema: + type: string + example: + "112233aabbcc" + required: true + - in: query + name: fromDate + schema: + type: integer + required: false + - in: query + name: endDate + schema: + type: integer + required: false + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: The venue to for the search. + name: venue + schema: + type: string + format: uuid + required: true + - in: query + description: return extended information + name: orderBy + schema: + type: string + example: serialNumber:a,created:d + required: false + - in: query + description: return extended information + name: orderSpec + schema: + type: boolean + default: false + required: false + responses: + 200: + $ref: '#/components/schemas/WifiClientHistoryList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - WiFiClientHistory + operationId: deleteWifiClientHistory + summary: Retrieve WiFi client history for debugging purpose + parameters: + - in: query + description: The venue to for the search. + name: venue + schema: + type: string + format: uuid + required: true + - in: path + name: client + schema: + type: string + example: + "112233aabbcc" + required: true + - in: query + name: fromDate + schema: + type: integer + required: false + - in: query + name: endDate + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: macFilter + schema: + type: string + example: + 112233445566, 11223344*, *5566 + required: false + responses: + 200: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + ######################################################################################### + ## + ## These are endpoints that all services in the OpenWiFi stack must provide + ## + ######################################################################################### + /system: + post: + tags: + - System Commands + summary: Perform some system wide commands. + operationId: systemCommand + requestBody: + description: Command details + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemCommandSetLogLevel' + - $ref: '#/components/schemas/SystemCommandReload' + - $ref: '#/components/schemas/SystemCommandGetLogLevels' + - $ref: '#/components/schemas/SystemCommandGetLogLevelNames' + - $ref: '#/components/schemas/SystemCommandGetSubsystemNames' + responses: + 200: + description: Successful command execution + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemGetLogLevelsResult' + - $ref: '#/components/schemas/SystemCommandGetLogLevelNamesResult' + - $ref: '#/components/schemas/SystemGetSubSystemNamesResult' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + get: + tags: + - System Commands + summary: Retrieve different values from the running service. + operationId: getSystemCommand + parameters: + - in: query + description: Get a value + name: command + schema: + type: string + enum: + - info + required: true + + responses: + 200: + description: Successful command execution + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemInfoResults' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' diff --git a/.gitbook/assets/owfms.yaml b/.gitbook/assets/owfms.yaml new file mode 100644 index 0000000..592c04e --- /dev/null +++ b/.gitbook/assets/owfms.yaml @@ -0,0 +1,848 @@ +openapi: 3.0.1 +info: + title: uCentral Firmware Service API + description: A process to manage new uCentral firmware distribution. + version: 2.0.0 + license: + name: BSD3 + url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE + contact: + name: Arilia Support + url: https://www.ucentral.info/support + +servers: + - url: 'https://localhost:16003/api/v1' + +security: + - ApiKeyAuth: [] + - bearerAuth: [] + +components: + securitySchemes: + ApiKeyAuth: + type: apiKey + in: header + name: X-API-KEY + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + + responses: + NotFound: + description: The specified resource was not found. + content: + application/json: + schema: + properties: + ErrorCode: + type: integer + ErrorDetails: + type: string + ErrorDescription: + type: string + + Unauthorized: + description: The requested does not have sufficient rights to perform the operation. + content: + application/json: + schema: + properties: + ErrorCode: + type: integer + enum: + - 0 # Success + - 1 # PASSWORD_CHANGE_REQUIRED, + - 2 # INVALID_CREDENTIALS, + - 3 # PASSWORD_ALREADY_USED, + - 4 # USERNAME_PENDING_VERIFICATION, + - 5 # PASSWORD_INVALID, + - 6 # INTERNAL_ERROR, + - 7 # ACCESS_DENIED, + - 8 # INVALID_TOKEN + ErrorDetails: + type: string + ErrorDescription: + type: string + + Success: + description: The requested operation was performed. + content: + application/json: + schema: + properties: + Operation: + type: string + Details: + type: string + Code: + type: integer + + schemas: + FirmwareDetails: + type: object + description: Definition of a firmware release + properties: + id: + type: string + format: uuid + deviceType: + type: string + description: + type: string + revision: + type: string + uri: + type: string + format: uri + image: + type: string + imageDate: + type: integer + format: int64 + size: + type: integer + format: int64 + downloadCount: + type: integer + format: int64 + firmwareHash: + type: string + owner: + type: string + location: + type: string + format: uri + uploader: + type: string + digest: + type: string + latest: + type: boolean + notes: + type: array + items: + $ref: '#/components/schemas/NoteInfo' + created: + type: integer + format: int64 + + FirmwareDetailsList: + type: object + properties: + firmwares: + type: array + items: + $ref: '#/components/schemas/FirmwareDetails' + + RevisionHistoryEntry: + type: object + properties: + id: + type: string + format: uuid + serialNumber: + type: string + revisionId: + type: string + format: uuid + upgraded: + type: integer + format: int64 + fromRelease: + type: string + toRelease: + type: string + commandUUID: + type: string + format: uuid + + RevisionHistoryEntryList: + type: object + properties: + history: + type: array + items: + $ref: '#/components/schemas/RevisionHistoryEntry' + + + FirmwareAgeDetails: + type: object + properties: + latestId: + type: string + image: + type: string + imageDate: + type: integer + format: uint64 + revision: + type: string + uri: + type: string + format: uri + age: + type: integer + format: int64 + example: this is in seconds. a 0 means we cannot determine the age. something like 'unknown' should be shown to the user. + latest: + type: boolean + + FirmwareAgeDetailsList: + type: object + properties: + ages: + type: array + items: + $ref: '#/components/schemas/FirmwareAgeDetails' + + DeviceConnectionInformation: + type: object + properties: + serialNumber: + type: string + revision: + type: string + deviceType: + type: string + endPoint: + type: string + format: uri + lastUpdate: + type: integer + format: uint64 + status: + type: string + enum: + - connected + - disconnected + - unknown + + DeviceConnectionInformationList: + type: object + properties: + devices: + type: array + items: + $ref: '#/components/schemas/DeviceConnectionInformation' + + DeviceReport: + type: object + properties: + snapshot: + type: integer + format: int64 + numberOfDevices: + type: integer + format: int64 + ouis: + $ref: '#/components/schemas/TagIntPairList' + revisions: + $ref: '#/components/schemas/TagIntPairList' + deviceTypes: + $ref: '#/components/schemas/TagIntPairList' + status: + $ref: '#/components/schemas/TagIntPairList' + endPoints: + $ref: '#/components/schemas/TagIntPairList' + unknownFirmwares: + $ref: '#/components/schemas/TagIntPairList' + usingLatest: + $ref: '#/components/schemas/TagIntPairList' + totalSecondsOld: + $ref: '#/components/schemas/TagIntPairList' + + ######################################################################################### + ## + ## These are endpoints that all services in the uCentral stack must provide + ## + ######################################################################################### + AnyPayload: + type: object + properties: + Document: + type: string + + StringList: + type: object + properties: + list: + type: array + items: + type: string + + TagValuePair: + type: object + properties: + tag: + type: string + value: + type: string + + TagValuePairList: + type: object + properties: + tagList: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + TagIntPair: + type: object + properties: + tag: + type: string + value: + type: integer + format: int64 + + TagIntPairList: + type: object + properties: + tagList: + type: array + items: + $ref: '#/components/schemas/TagIntPair' + + NoteInfo: + type: object + properties: + created: + type: integer + format: int64 + createdBy: + type: string + note: + type: string + + SystemInfoResults: + type: object + properties: + version: + type: string + uptime: + type: integer + format: integer64 + start: + type: integer + format: integer64 + os: + type: string + processors: + type: integer + hostname: + type: string + certificates: + type: array + items: + type: object + properties: + filename: + type: string + expires: + type: integer + format: int64 + + SystemCommandSetLogLevel: + type: object + properties: + command: + type: string + enum: + - setloglevel + subsystems: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + SystemCommandReload: + type: object + properties: + command: + type: string + enum: + - reload + subsystems: + type: array + items: + type: string + example: these are the SubSystems names retrieve with the GetSubSystemsNamesResult. + + SystemCommandGetLogLevels: + type: object + properties: + command: + type: string + enum: + - getloglevels + + SystemGetLogLevelsResult: + type: object + properties: + taglist: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + SystemCommandGetLogLevelNames: + type: object + properties: + command: + type: string + enum: + - getloglevelnames + + SystemCommandGetSubsystemNames: + type: object + properties: + command: + type: string + enum: + - getsubsystemnames + + SystemCommandGetLogLevelNamesResult: + type: object + properties: + list: + type: array + items: + type: string + + SystemGetSubSystemNemesResult: + type: object + properties: + taglist: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + +######################################################################################### +## +## End of uCentral system-wide values +## +######################################################################################### +paths: + /firmwares: + get: + tags: + - Firmware + summary: Returns a list of firmwares. + description: Get a list of firmwares. + operationId: getFirmwareList + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + name: latestOnly + description: Return only the latest firwares + schema: + type: boolean + required: false + - in: query + name: deviceType + schema: + type: string + required: false + - in: query + name: revisionSet + schema: + type: boolean + required: false + - in: query + name: deviceSet + schema: + type: boolean + required: false + responses: + 200: + description: List firmwares + content: + application/json: + schema: + $ref: '#/components/schemas/FirmwareDetailsList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /firmware/{id}: + get: + tags: + - Firmware + summary: Returns a Firmware + description: Get a Firmware. + operationId: getFirmware + parameters: + - in: path + name: id + schema: + type: string + format: uuid + required: true + responses: + 200: + description: A Firmware definition + content: + application/json: + schema: + $ref: '#/components/schemas/FirmwareDetails' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + post: + tags: + - Firmware + summary: Create A New firmware + operationId: createFirmware + parameters: + - in: path + name: id + schema: + type: string + format: uuid + required: true + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/FirmwareDetails' + responses: + 200: + description: Created a firmware entry. + content: + application/json: + schema: + $ref: '#/components/schemas/FirmwareDetails' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - Firmware + summary: Update A New firmware + operationId: upodateFirmware + parameters: + - in: path + name: id + schema: + type: string + format: uuid + required: true + requestBody: + description: Firmware details + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/FirmwareDetails' + responses: + 200: + description: Successfully updated firmware + content: + application/json: + schema: + $ref: '#/components/schemas/FirmwareDetails' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Firmware + summary: Delete some Firmware + operationId: deleteFirmware + parameters: + - in: path + name: id + schema: + type: string + format: uuid + required: true + responses: + 204: + description: Successfully deleted Firmware for the device. + content: + application/json: + schema: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /revisionHistory/{serialNumber}: + get: + tags: + - RevisionHistory + summary: List all the defined device revision history + operationId: getRevisionHistory + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + responses: + 200: + description: List of device history upgrade. + content: + application/json: + schema: + $ref: '#/components/schemas/RevisionHistoryEntryList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - RevisionHistory + summary: Delete specific hostory elements for a device + operationId: deleteRevisionHistory + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: id + schema: + type: string + format: uuid + required: true + responses: + 204: + description: Success. + content: + application/json: + schema: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /firmwareAge: + get: + tags: + - Firmware + summary: Calculate how old a version of firmware is. + operationId: getFirmwareAge + parameters: + - in: query + description: The exact current verion of the firmware on that device. + name: revision + schema: + type: string + required: true + - in: query + description: The exact current verion of the firmware on that device. + name: deviceType + schema: + type: string + required: true + - in: query + description: Specify lits of serial numbers to retrive age for + name: select + schema: + type: string + example: select=serial1,serial2,serial4,serial5. + required: false + responses: + 200: + description: The recommended latest version to update to. + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/FirmwareAgeDetails' + - $ref: '#/components/schemas/FirmwareAgeDetailsList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /connectedDevices: + get: + tags: + - ConnectedDevices + summary: Get a list of connected devices and some values. + operationId: getConnectedDevices + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + responses: + 200: + description: List firmwares + content: + application/json: + schema: + $ref: '#/components/schemas/DeviceConnectionInformationList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /connectedDevice/{serialNumber}: + get: + tags: + - ConnectedDevices + summary: Get status of a connected device. + operationId: getConnectedDevice + parameters: + - in: path + description: SerialNumber of the device + name: serialNumber + schema: + type: string + required: true + responses: + 200: + description: Get information about a connected device. + content: + application/json: + schema: + $ref: '#/components/schemas/DeviceConnectionInformation' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /deviceReport: + get: + tags: + - DeviceInfo + summary: get an analysis of the existing devices we know about. + responses: + 200: + description: A full analysis report + content: + application/json: + schema: + $ref: '#/components/schemas/DeviceReport' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + ######################################################################################### + ## + ## These are endpoints that all services in the uCentral stack must provide + ## + ######################################################################################### + /system: + post: + tags: + - System Commands + summary: Perform some system wide commands + operationId: systemCommand + requestBody: + description: Command details + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemCommandSetLogLevel' + - $ref: '#/components/schemas/SystemCommandReload' + - $ref: '#/components/schemas/SystemCommandGetLogLevels' + - $ref: '#/components/schemas/SystemCommandGetLogLevelNames' + - $ref: '#/components/schemas/SystemCommandGetSubsystemNames' + responses: + 200: + description: Successfull command execution + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemGetLogLevelsResult' + - $ref: '#/components/schemas/SystemCommandGetLogLevelNamesResult' + - $ref: '#/components/schemas/SystemGetSubSystemNemesResult' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + get: + tags: + - System Commands + summary: Retrieve different values from the running service. + operationId: getSystemCommand + parameters: + - in: query + description: Get a value + name: command + schema: + type: string + enum: + - info + required: true + + responses: + 200: + description: Successfull command execution + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemInfoResults' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' diff --git a/.gitbook/assets/owgw.yaml b/.gitbook/assets/owgw.yaml new file mode 100644 index 0000000..ea81f3a --- /dev/null +++ b/.gitbook/assets/owgw.yaml @@ -0,0 +1,2413 @@ +openapi: 3.0.1 +info: + title: uCentral gateway API + description: A process to manage configuration for devices. + version: 2.0.0 + license: + name: BSD3 + url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE + contact: + name: Arilia Support + email: ucentralsupport@arilia.com + url: https://www.ucentral.info/support + +servers: + - url: 'https://localhost:16001/api/v1' + +security: + - bearerAuth: [] + - ApiKeyAuth: [] + +components: + securitySchemes: + ApiKeyAuth: + type: apiKey + in: header + name: X-API-KEY + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + + responses: + NotFound: + description: The specified resource was not found. + content: + application/json: + schema: + properties: + ErrorCode: + type: integer + ErrorDetails: + type: string + ErrorDescription: + type: string + + Unauthorized: + description: The requested does not have sufficient rights to perform the operation. + content: + application/json: + schema: + properties: + ErrorCode: + type: integer + enum: + - 0 # Success + - 1 # PASSWORD_CHANGE_REQUIRED, + - 2 # INVALID_CREDENTIALS, + - 3 # PASSWORD_ALREADY_USED, + - 4 # USERNAME_PENDING_VERIFICATION, + - 5 # PASSWORD_INVALID, + - 6 # INTERNAL_ERROR, + - 7 # ACCESS_DENIED, + - 8 # INVALID_TOKEN + ErrorDetails: + type: string + ErrorDescription: + type: string + + Success: + description: The requested operation was performed. + content: + application/json: + schema: + properties: + Operation: + type: string + Details: + type: string + Code: + type: integer + + schemas: + DeviceType: + type: string + default: AP + enum: + - AP + - SWITCH + - IOT + - MESH + + Device: + type: object + description: Definition of uCentral device + required: + - deviceType + properties: + owner: + type: string + format: uuid + location: + type: string + format: uuid + venue: + type: string + format: uuid + serialNumber: + type: string + deviceType: + $ref: '#/components/schemas/DeviceType' + macAddress: + type: string + manufacturer: + type: string + UUID: + type: integer + format: int64 + configuration: + type: string + notes: + type: array + items: + $ref: '#/components/schemas/NoteInfo' + createdTimestamp: + type: integer + format: int64 + lastConfigurationChange: + type: integer + format: int64 + lastConfigurationDownload: + type: integer + format: int64 + firmware: + type: string + devicePassword: + type: string + + DeviceWithStatus: + type: object + description: Definition of uCentral device + required: + - deviceType + properties: + owner: + type: string + format: uuid + location: + type: string + format: uuid + venue: + type: string + format: uuid + serialNumber: + type: string + deviceType: + $ref: '#/components/schemas/DeviceType' + macAddress: + type: string + manufacturer: + type: string + UUID: + type: integer + format: int64 + configuration: + type: string + compatible: + type: string + fwUpdatePolicy: + type: string + notes: + type: string + createdTimestamp: + type: integer + format: int64 + lastConfigurationChange: + type: integer + format: int64 + lastConfigurationDownload: + type: integer + format: int64 + lastFWUpdate: + type: integer + format: int64 + firmware: + type: string + connected: + type: boolean + ipAddress: + type: string + txBytes: + type: integer + format: int64 + rxBytes: + type: integer + format: int64 + associations_2G: + type: integer + format: int64 + associations_5G: + type: integer + format: int64 + devicePassword: + type: string + lastContact: + type: integer + format: int64 + + DeviceList: + type: object + description: Definition of uCentral device list + properties: + devices: + type: array + items: + $ref : '#/components/schemas/Device' + + DeviceListWithStatus: + type: object + description: Definition of uCentral device list including device status. + properties: + devicesWithStatus: + type: array + items: + $ref : '#/components/schemas/DeviceWithStatus' + + SerialNumberList: + type: object + description: List of serial numbers. + properties: + serialNumbers: + type: array + items: + type: string + + DeviceCount: + type: object + description: The number of devices in the DB. + properties: + count: + type: integer + format: int64 + + DeviceStatus: + type: object + description: Current device status. + properties: + serialNumber: + type: string + ipAddress: + type: string + txBytes: + type: integer + format: int64 + rxBytes: + type: integer + format: int64 + messageCount: + type: integer + format: int64 + UUID: + type: integer + format: int64 + connected: + type: boolean + lastContact: + type: integer + format: int64 + firmware: + type: string + associations_2G: + type: integer + format: int64 + associations_5G: + type: integer + format: int64 + verifiedCertificate: + type: string + enum: + - NO_CERTIFICATE, + - VALID_CERTIFICATE, + - MISMATCH_SERIAL, + - VERIFIED + + DeviceCapabilities: + type: object + description: Describes the capabilities a device can support. + properties: + serialNumber: + type: string + capabilities: + type: string + lastUpdate: + type: integer + format: int64 + firstUpdate: + type: integer + format: int64 + + StatisticsDetails: + type: object + properties: + serialNumber: + type: string + recorded: + type: integer + format: int64 + UUID: + type: integer + format: int64 + data: + type: string + + StatisticsRecords: + type: object + properties: + serialNumber: + type: string + values: + type: array + items: + $ref: '#/components/schemas/StatisticsDetails' + + NameValuePair: + type: object + properties: + name: + type: string + value: + type: integer + format: int64 + + InterfaceStatistics: + type: object + properties: + name: + type: string + values: + type: array + items: + $ref: '#/components/schemas/NameValuePair' + + LifetimeStatistics: + type: object + properties: + serialNumber: + type: string + interfaces: + type: array + items: + $ref: '#/components/schemas/InterfaceStatistics' + + CommandDetails: + type: object + properties: + command: + type: string + payload: + type: string + when: + type: integer + format: int64 + serialNumber: + type: string + + CommandSubmitSuccess: + description: The command was submitted succesfully. + properties: + serialNumber: + type: string + UUID: + type: string + format: uuid + + DeviceConfigureRequest: + type: object + properties: + serialNumber: + type: string + UUID: + type: integer + format: int64 + configuration: + type: string + when: + type: integer + format: int64 + + DeviceLog: + type: object + properties: + log: + type: string + recorded: + type: integer + format: int64 + severity: + type: integer + format: int64 + data: + type: string + logType: + type: integer + format: int64 + UUID: + type: integer + format: int64 + + DeviceLogList: + type: object + properties: + serialNumber: + type: string + values: + type: array + items: + $ref: '#/components/schemas/DeviceLog' + + HealthCheck: + type: object + properties: + UUID: + type: integer + format: int64 + sanity: + type: integer + format: int64 + data: + type: string + recorded: + type: integer + format: int64 + + HealthCheckList: + type: object + properties: + serialNumber: + type: string + values: + type: array + items: + $ref: '#/components/schemas/HealthCheck' + + DefaultConfiguration: + type: object + properties: + name: + type: string + modelIds: + type: string + description: + type: string + configuration: + type: string + created: + type: integer + format: int64 + lastModified: + type: integer + format: int64 + + DefaultConfigurationList: + properties: + configurations: + type: array + items: + $ref : '#/components/schemas/DefaultConfiguration' + + UpgradeRequest: + type: object + properties: + uri: + type: string + serialNumber: + type: string + when: + type: integer + format: int64 + + RebootRequest: + type: object + properties: + serialNumber: + type: string + when: + type: integer + format: int64 + + FactoryRequest: + type: object + properties: + serialNumber: + type: string + when: + type: integer + format: int64 + keepRedirector: + type: boolean + + LEDsRequest: + type: object + properties: + serialNumber: + type: string + when: + type: integer + format: int64 + duration: + description: only applies to the blink pattern + type: integer + format: int64 + pattern: + type: string + enum: + - on + - off + - blink + + MessageRequest: + type: object + properties: + serialNumber: + type: string + when: + type: integer + format: int64 + message: + type: string + enum: + - state + - healthcheck + + TraceRequest: + type: object + properties: + serialNumber: + type: string + when: + type: integer + format: int64 + duration: + type: integer + format: int64 + numberOfPackets: + type: integer + format: int64 + network: + type: string + interface: + type: string + + CommandInfo: + type: object + properties: + UUID: + type: string + format: uuid + command: + type: string + details: + type: string + serialNumber: + type: string + submitted: + type: integer + format: int64 + executed: + type: integer + format: int64 + completed: + type: integer + format: int64 + when: + type: integer + format: int64 + errorText: + type: string + results: + type: string + errorCode: + type: integer + format: int64 + submittedBy: + type: string + status: + type: string + custom: + type: integer + format: int64 + waitingForFile: + type: integer + format: int64 + attachFile: + type: integer + format: int64 + attachSize: + type: integer + format: int64 + attachType: + type: string + + CommandInfoList: + type: object + properties: + commands: + type: array + items: + $ref: '#/components/schemas/CommandInfo' + + DeviceDashboard: + type: object + properties: + snapshot: + type: integer + format: int64 + numberOfDevices: + type: integer + format: int64 + commands: + $ref: '#/components/schemas/TagIntPairList' + upTimes: + $ref: '#/components/schemas/TagIntPairList' + memoryUsed: + $ref: '#/components/schemas/TagIntPairList' + load1: + $ref: '#/components/schemas/TagIntPairList' + load5: + $ref: '#/components/schemas/TagIntPairList' + load15: + $ref: '#/components/schemas/TagIntPairList' + vendors: + $ref: '#/components/schemas/TagIntPairList' + status: + $ref: '#/components/schemas/TagIntPairList' + type: + $ref: '#/components/schemas/TagIntPairList' + deviceType: + $ref: '#/components/schemas/TagIntPairList' + healths: + $ref: '#/components/schemas/TagIntPairList' + certificates: + $ref: '#/components/schemas/TagIntPairList' + lastContact: + $ref: '#/components/schemas/TagIntPairList' + associations: + $ref: '#/components/schemas/TagIntPairList' + + TelemetryStreamRequest: + type: object + properties: + serialNumber: + type: string + interval: + type: integer + example: + 0 - means to stop streaming, values 1-120 in seconds. + types: + type: array + items: + type: string + enum: + - dhcp-snooping + - wire-frames + - state + uuid: + type: string + example: + only valid when terminating a stream + + TelemetryStreamResponse: + type: object + properties: + serialNumber: + type: string + uuid: + type: string + format: uuid + uri: + type: string + format: uri + example: + wss://host.domain:port/endpoint + + ######################################################################################### + ## + ## These are endpoints that all services in the uCentral stack must provide + ## + ######################################################################################### + AnyPayload: + type: object + properties: + Document: + type: string + + StringList: + type: object + properties: + list: + type: array + items: + type: string + + TagValuePair: + type: object + properties: + tag: + type: string + value: + type: string + + TagValuePairList: + type: object + properties: + tagList: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + TagIntPair: + type: object + properties: + tag: + type: string + value: + type: integer + format: int64 + + TagIntPairList: + type: object + properties: + tagList: + type: array + items: + $ref: '#/components/schemas/TagIntPair' + + SystemCommandDetails: + type: object + properties: + command: + type: string + enum: + - setloglevels + - getloglevels + - getSubSystemNames + - getLogLevelNames + - stats + parameters: + oneOf: + - $ref: '#/components/schemas/StringList' + - $ref: '#/components/schemas/TagValuePairList' + + SystemCommandResults: + type: object + oneOf: + - $ref: '#/components/schemas/StringList' + - $ref: '#/components/schemas/TagValuePairList' + + NoteInfo: + type: object + properties: + created: + type: integer + format: int64 + createdBy: + type: string + note: + type: string + + SystemInfoResults: + type: object + properties: + version: + type: string + uptime: + type: integer + format: integer64 + start: + type: integer + format: integer64 + os: + type: string + processors: + type: integer + hostname: + type: string + certificates: + type: array + items: + type: object + properties: + filename: + type: string + expires: + type: integer + format: int64 + + SystemCommandSetLogLevel: + type: object + properties: + command: + type: string + enum: + - setloglevel + subsystems: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + SystemCommandReload: + type: object + properties: + command: + type: string + enum: + - reload + subsystems: + type: array + items: + type: string + example: these are the SubSystems names retrieve with the GetSubSystemsNamesResult. + + SystemCommandGetLogLevels: + type: object + properties: + command: + type: string + enum: + - getloglevels + + SystemGetLogLevelsResult: + type: object + properties: + taglist: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + SystemCommandGetLogLevelNames: + type: object + properties: + command: + type: string + enum: + - getloglevelnames + + SystemCommandGetSubsystemNames: + type: object + properties: + command: + type: string + enum: + - getsubsystemnames + + SystemCommandGetLogLevelNamesResult: + type: object + properties: + list: + type: array + items: + type: string + + SystemGetSubSystemNamesResult: + type: object + properties: + taglist: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + ######################################################################################### + ## + ## End of uCentral system wide values + ## + ######################################################################################### + BlackDeviceInfo: + type: object + properties: + serialNumber: + type: string + created: + type: integer + format: int64 + readOnly: true + author: + type: string + readOnly: true + reason: + type: string + + BlackDeviceList: + type: object + properties: + devices: + type: array + items: + $ref: '#/components/schemas/BlackDeviceInfo' + + WifiBands: + type: object + properties: + bands: + type: array + items: + type: string + enum: [ "2" , "5", "5l", "5u" , "6" ] + + WifiChannels: + type: object + properties: + channels: + type: array + items: + type: integer + + WifiScanRequest: + type: object + properties: + serialNumber: + type: string + verbose: + type: boolean + activeScan: + type: boolean + selector: + oneOf: + - $ref: '#/components/schemas/WifiBands' + - $ref: '#/components/schemas/WifiChannels' + required: + - serialNumber + + EventQueueRequest: + type: object + properties: + serialNumber: + type: string + types: + type: array + items: + type: string + enum: + - dhcp + - rrm + + EventQueueResponse: + type: object + properties: + serialNumber: + type: string + UUID: + type: string + format: uuid + result: + type: string + + RttySessionDetails: + type: object + properties: + serialNumber: + type: string + server: + type: string + port: + type: integer + format: int32 + token: + type: string + timeout: + type: integer + format: int32 + connectionId: + type: string + started: + type: integer + format: int64 + commandUUID: + type: string + viewport: + type: integer + format: int32 + password: + type: string + + CapabilitiesModel: + type: object + properties: + deviceType: + type: string + capabilities: + type: string + + CapabilitiesModelList: + type: object + properties: + devices: + type: array + items: + $ref: '#/components/schemas/CapabilitiesModel' + +paths: + /devices: + get: + tags: + - Devices + summary: Returns a list of devices. + description: Get a list of devices. + operationId: getDeviceList + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of devices comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + - in: query + description: only serial numbers of full device details + name: serialOnly + schema: + type: boolean + - in: query + description: return the number of devices + name: countOnly + schema: + type: boolean + example: countOnly=true + - in: query + description: Return extra information with the device information + name: deviceWithStatus + schema: + type: boolean + responses: + 200: + description: List devices + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/DeviceList' + - $ref: '#/components/schemas/DeviceListWithStatus' + - $ref: '#/components/schemas/SerialNumberList' + - $ref: '#/components/schemas/DeviceCount' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /commands: + get: + tags: + - Commands + summary: Returns a list of commands. + description: Get a list of commands. + operationId: getCommandList + parameters: + - in: query + name: serialNumber + schema: + type: string + required: false + - in: query + name: startDate + schema: + type: integer + format: int64 + required: false + - in: query + name: endDate + schema: + type: integer + format: int64 + - in: query + name: offset + schema: + type: integer + format: int64 + - in: query + name: limit + schema: + type: integer + format: int64 + - in: query + description: Selecting this option means the newest record will be returned. Use limit to select how many. + name: newest + schema: + type: boolean + required: false + + responses: + 200: + description: List commands + content: + application/json: + schema: + $ref: '#/components/schemas/CommandInfoList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Commands + summary: Delete some commands + operationId: deleteCommands + parameters: + - in: query + name: serialNumber + schema: + type: string + required: true + - in: query + name: startDate + schema: + type: integer + format: int64 + required: false + - in: query + name: endDate + schema: + type: integer + format: int64 + + responses: + 204: + description: Successfully deleted commands for the device. + content: + application/json: + schema: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /command/{commandUUID}: + get: + tags: + - Commands + summary: Returns a specific command. + description: Returns a specific command + operationId: getACommandDetails + parameters: + - in: path + name: commandUUID + schema: + type: string + format: uuid + required: true + responses: + 200: + description: List commands + content: + application/json: + schema: + $ref: '#/components/schemas/CommandInfo' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Commands + summary: Delete a specific command. + description: Delete a specific command + operationId: deleteACommand + parameters: + - in: path + name: commandUUID + schema: + type: string + format: uuid + required: true + responses: + 204: + description: Delete command success + content: + application/json: + schema: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /default_configurations: + get: + tags: + - Configurations + summary: Retrieve the lists of all default configurations. + description: Retrieve the lists of all default configurations. + operationId: getDefaultConfigurations + + responses: + 200: + description: List of defautl configurations included + content: + application/json: + schema: + $ref: '#/components/schemas/DefaultConfigurationList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /default_configuration/{name}: + get: + tags: + - Configurations + summary: Retrieve a default configuration. + description: Retrieve a default configuration. + operationId: getDefaultConfiguration + parameters: + - in: path + name: name + schema: + type: string + required: true + responses: + 200: + description: Default configurations included + content: + application/json: + schema: + $ref: '#/components/schemas/DefaultConfiguration' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + post: + tags: + - Configurations + summary: Create a default configuration. + description: Create a default configuration. + operationId: createDefaultConfiguration + parameters: + - in: path + name: name + schema: + type: string + required: true + requestBody: + description: Information used to create the new device + content: + application/json: + schema: + $ref: '#/components/schemas/DefaultConfiguration' + responses: + 200: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Configurations + summary: Delete a default default configuration + description: Delete a default default configuration + operationId: deleteDefaultConfiguration + parameters: + - in: path + name: name + schema: + type: string + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - Configurations + summary: Update a default configuration + description: Update a default configuration + operationId: updateDefaultConfiguration + parameters: + - in: path + name: name + schema: + type: string + required: true + requestBody: + description: Configuration details + content: + application/json: + schema: + $ref: '#/components/schemas/DefaultConfiguration' + responses: + 200: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}: + get: + tags: + - Devices + summary: Retrieve information for a single device. + description: Retrieve all the inforamtion about a single device + operationId: getDeviceInformation + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + responses: + 200: + description: Device information + content: + application/json: + schema: + $ref: '#/components/schemas/Device' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + post: + tags: + - Devices + summary: Create a new device. + operationId: createNewDevice + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + - in: query + name: validateOnly + schema: + type: boolean + required: false + requestBody: + description: Information used to create the new device + content: + application/json: + schema: + $ref: '#/components/schemas/Device' + responses: + 200: + description: Successful device creation will return the device record with the proper device ID + content: + application/json: + schema: + $ref: '#/components/schemas/Device' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - Devices + summary: Update a device. + operationId: updateNewDevice + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + requestBody: + description: Information used to create the new device + content: + application/json: + schema: + $ref: '#/components/schemas/Device' + responses: + 200: + description: Successful device creation will return the device record with the proper device ID + content: + application/json: + schema: + $ref: '#/components/schemas/Device' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Devices + summary: Delete a single device. + operationId: deleteDevice + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/logs: + get: + tags: + - Commands + summary: Get the latest logs for a given device + operationId: getDeviceLogs + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + - in: query + name: startDate + schema: + type: integer + format: int64 + required: false + - in: query + name: endDate + schema: + type: integer + format: int64 + - in: query + name: offset + schema: + type: integer + format: int64 + - in: query + name: limit + schema: + type: integer + format: int64 + - in: query + name: logType + description: 0=any kind of logs (default) 0=normal logs only 1=crash logs only + schema: + type: integer + format: int64 + - in: query + description: Selecting this option means the newest record will be returned. Use limit to select how many. + name: newest + schema: + type: boolean + required: false + + responses: + 200: + description: Array of device logs for this device + content: + application/json: + schema: + $ref: '#/components/schemas/DeviceLogList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Commands + summary: Delete some device logs. + operationId: deleteDeviceLogs + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + - in: query + name: startDate + schema: + type: integer + format: int64 + required: false + - in: query + name: endDate + schema: + type: integer + format: int64 + - in: query + name: logType + description: 0=any kind of logs (default) 1=normal logs only 2=crash logs only + schema: + type: integer + format: int64 + + responses: + 204: + description: Successfully deleted logs for the device. + content: + application/json: + schema: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/healthchecks: + get: + tags: + - Commands + summary: Get the latest health checks for a given device. + operationId: getDeviceHealthChecks + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + - in: query + name: startDate + schema: + type: integer + format: int64 + required: false + - in: query + name: endDate + schema: + type: integer + format: int64 + required: false + - in: query + name: offset + schema: + type: integer + format: int64 + required: false + - in: query + name: limit + schema: + type: integer + format: int64 + required: false + - in: query + description: Selecting this option means the newest record will be returned. Use limit to select how many. + name: newest + schema: + type: boolean + required: false + - in: query + description: Selecting this option means the last healthcheck will be returned. All other parameters will be ignored. + name: lastOnly + schema: + type: boolean + required: false + + responses: + 200: + description: Array of device health checks for this device + content: + application/json: + schema: + $ref: '#/components/schemas/HealthCheckList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Commands + summary: Delete some device health checks. + operationId: deleteDeviceHealthChecks + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + - in: query + name: startDate + schema: + type: integer + format: int64 + required: false + - in: query + name: endDate + schema: + type: integer + format: int64 + required: false + + responses: + 204: + description: Successfully deleted health checks for the device. + content: + application/json: + schema: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/capabilities: + get: + tags: + - Commands + summary: Get the latest capabilities for a given device. + operationId: getDeviceCapabilities + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + responses: + 200: + description: List of logs for this device + content: + application/json: + schema: + $ref: '#/components/schemas/DeviceCapabilities' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Commands + summary: Delete the capabilities for a given device. + operationId: deleteDeviceCapabilities + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + responses: + 204: + description: List of logs for this device + content: + application/json: + schema: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/statistics: + get: + tags: + - Commands + summary: Get the latest statistics for a given device. + operationId: getDeviceStats + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + - in: query + name: startDate + schema: + type: integer + format: int64 + required: false + - in: query + name: endDate + schema: + type: integer + format: int64 + required: false + - in: query + name: offset + schema: + type: integer + format: int64 + required: false + - in: query + name: limit + schema: + type: integer + format: int64 + required: false + - in: query + description: Selecting this option means the LifetimeStatistics will be returned. All other parameters will be ignored. + name: lifetime + schema: + type: boolean + required: false + - in: query + description: Selecting this option means the LifetimeStatistics will be returned. All other parameters will be ignored. + name: lastOnly + schema: + type: boolean + required: false + - in: query + description: Selecting this option means the newest record will be returned. Use limit to select how many. + name: newest + schema: + type: boolean + required: false + + responses: + 200: + description: Array of statistics for this device + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/StatisticsRecords' + - $ref: '#/components/schemas/LifetimeStatistics' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Commands + summary: Get the latest statistics for a given device. + operationId: deleteDeviceStats + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + - in: query + name: startDate + schema: + type: integer + format: int64 + required: false + - in: query + name: endDate + schema: + type: integer + format: int64 + required: false + + responses: + 204: + description: Array of statistics for this device + content: + application/json: + schema: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/status: + get: + tags: + - Commands + summary: Get the latest status for a given device. + operationId: getDeviceStatus + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + responses: + 200: + description: Status for the given device + content: + application/json: + schema: + $ref: '#/components/schemas/DeviceStatus' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/command: + post: + tags: + - Commands + summary: Post a command to a device + operationId: executeCommand + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + requestBody: + description: Command details + content: + application/json: + schema: + $ref: '#/components/schemas/CommandDetails' + responses: + 200: + $ref: '#/components/schemas/CommandInfo' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/configure: + post: + tags: + - Commands + summary: Configure a device. + operationId: updateConfigurationForADevice + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + requestBody: + description: Command details + content: + application/json: + schema: + $ref: '#/components/schemas/DeviceConfigureRequest' + responses: + 200: + $ref: '#/components/schemas/CommandInfo' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/upgrade: + post: + tags: + - Commands + summary: Upgrade a device. + operationId: UpgradeDeviceFirmware + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + requestBody: + description: Command details + content: + application/json: + schema: + $ref: '#/components/schemas/UpgradeRequest' + responses: + 200: + $ref: '#/components/schemas/CommandInfo' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/reboot: + post: + tags: + - Commands + summary: Reboot a device. + operationId: rebootDevice + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + requestBody: + description: Command details + content: + application/json: + schema: + $ref: '#/components/schemas/RebootRequest' + responses: + 200: + $ref: '#/components/schemas/CommandInfo' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/factory: + post: + tags: + - Commands + summary: Factory reset a device. + operationId: factoryReset + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + requestBody: + description: Command details + content: + application/json: + schema: + $ref: '#/components/schemas/FactoryRequest' + responses: + 200: + $ref: '#/components/schemas/CommandInfo' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/leds: + post: + tags: + - Commands + summary: Blink the LEDs on a device. + operationId: ledsRequest + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + requestBody: + description: Command details + content: + application/json: + schema: + $ref: '#/components/schemas/LEDsRequest' + responses: + 200: + $ref: '#/components/schemas/CommandInfo' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/trace: + post: + tags: + - Commands + summary: Launch a trace for a device. + operationId: traceRequest + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + requestBody: + description: Command details + content: + application/json: + schema: + $ref: '#/components/schemas/TraceRequest' + responses: + 200: + $ref: '#/components/schemas/CommandInfo' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/wifiscan: + post: + tags: + - Commands + summary: Launch a wifi scan for a device. + operationId: wifiscanRequest + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + requestBody: + description: Scan details + content: + application/json: + schema: + $ref: '#/components/schemas/WifiScanRequest' + responses: + 200: + $ref: '#/components/schemas/CommandInfo' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/request: + post: + tags: + - Commands + summary: Request a specific message + operationId: messageRequest + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + requestBody: + description: Message request details + content: + application/json: + schema: + $ref: '#/components/schemas/MessageRequest' + responses: + 200: + $ref: '#/components/schemas/CommandSubmitSuccess' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/eventqueue: + post: + tags: + - Commands + summary: Request a list of queued events. + operationId: eventQueueRequest + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + requestBody: + description: Message request details + content: + application/json: + schema: + $ref: '#/components/schemas/EventQueueRequest' + responses: + 200: + $ref: '#/components/schemas/EventQueueResponse' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/telemetry: + post: + tags: + - Commands + summary: Request a telemetry stream. + operationId: eventTelemetryStreamRequest + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + requestBody: + description: Message request details + content: + application/json: + schema: + $ref: '#/components/schemas/TelemetryStreamRequest' + responses: + 200: + $ref: '#/components/schemas/TelemetryStreamResponse' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /ouis: + get: + tags: + - OUIs + operationId: getOUIs + summary: Get a list of OUIs. + parameters: + - in: query + name: macList + schema: + type: string + required: true + responses: + 200: + $ref: '#/components/schemas/TagValuePairList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /device/{serialNumber}/rtty: + get: + tags: + - Commands + summary: Get the rtty parameters to initiate a session. + operationId: getRttySessionInfo + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + responses: + 200: + description: Session information + content: + application/json: + schema: + $ref: '#/components/schemas/RttySessionDetails' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /file/{uuid}: + get: + tags: + - Files + summary: Get a file from the upload directory. + operationId: getUploadFile + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: serialNumber + schema: + type: string + required: true + responses: + 200: + description: Succesfull file retrieval + content: + application/octet-stream: + schema: + type: string + format: binary + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Files + summary: Delete a file from the upload directory. + operationId: deleteUploadFidelete + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: serialNumber + schema: + type: string + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /blacklist: + get: + tags: + - Blacklist + summary: Returns a list blacklisted devices. + description: Get a list of blacklisted devices. + operationId: getBlacklistDeviceList + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + responses: + 200: + description: List blacklisted devices + content: + application/json: + schema: + $ref: '#/components/schemas/BlackDeviceList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /blacklist/{serialNumber}: + get: + tags: + - Blacklist + summary: Returns a blacklist entry. + description: Get a list of blacklisted devices. + operationId: getBlacklistDevice + parameters: + - in: path + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: serialNumber + schema: + type: string + required: true + responses: + 200: + description: List blacklisted devices + content: + application/json: + schema: + $ref: '#/components/schemas/BlackDeviceInfo' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + post: + tags: + - Blacklist + summary: Create to the blacklist. + operationId: createBlackListDevice + parameters: + - in: path + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: serialNumber + schema: + type: string + required: true + requestBody: + description: Add blacklisted device + content: + application/json: + schema: + $ref: '#/components/schemas/BlackDeviceInfo' + responses: + 200: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - Blacklist + summary: Modify to the blacklist. + operationId: modifyBlackList + parameters: + - in: path + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: serialNumber + schema: + type: string + required: true + requestBody: + description: Add blacklisted devices + content: + application/json: + schema: + $ref: '#/components/schemas/BlackDeviceInfo' + responses: + 200: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Blacklist + summary: Delete from the blacklist. + operationId: deleteFromBlackList + parameters: + - in: path + name: serialNumber + schema: + type: string + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /capabilities: + get: + tags: + - Devices + summary: Get the list of device types and capabilities. + operationId: getCapabilitiesList + responses: + 200: + description: Successful command execution + content: + application/json: + schema: + $ref: '#/components/schemas/CapabilitiesModelList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /deviceDashboard: + get: + tags: + - Dashboards + summary: Get the last version of the dashboard. + operationId: getDeviceDashboard + responses: + 200: + $ref: '#/components/schemas/DeviceDashboard' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + ######################################################################################### + ## + ## These are endpoints that all services in the uCentral stack must provide + ## + ######################################################################################### + /system: + post: + tags: + - System Commands + summary: Perform some system wide commands. + operationId: systemCommand + requestBody: + description: Command details + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemCommandSetLogLevel' + - $ref: '#/components/schemas/SystemCommandReload' + - $ref: '#/components/schemas/SystemCommandGetLogLevels' + - $ref: '#/components/schemas/SystemCommandGetLogLevelNames' + - $ref: '#/components/schemas/SystemCommandGetSubsystemNames' + responses: + 200: + description: Successful command execution + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemGetLogLevelsResult' + - $ref: '#/components/schemas/SystemCommandGetLogLevelNamesResult' + - $ref: '#/components/schemas/SystemGetSubSystemNamesResult' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + get: + tags: + - System Commands + summary: Retrieve different values from the running service. + operationId: getSystemCommand + parameters: + - in: query + description: Get a value + name: command + schema: + type: string + enum: + - info + required: true + + responses: + 200: + description: Successful command execution + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemInfoResults' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' \ No newline at end of file diff --git a/.gitbook/assets/owprov (1).yaml b/.gitbook/assets/owprov (1).yaml new file mode 100644 index 0000000..7f55715 --- /dev/null +++ b/.gitbook/assets/owprov (1).yaml @@ -0,0 +1,3081 @@ +openapi: 3.0.1 +info: + title: OpenWiFi Provisioning Model + description: Definitions and APIs to manages an OpenWiFi network. + version: 2.5.0 + license: + name: BSD3 + url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE + +servers: + - url: 'https://localhost:16005/api/v1' + +security: + - bearerAuth: [] + - ApiKeyAuth: [] + +components: + securitySchemes: + ApiKeyAuth: + type: apiKey + in: header + name: X-API-KEY + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + + responses: + NotFound: + description: The specified resource was not found. + content: + application/json: + schema: + properties: + ErrorCode: + type: integer + ErrorDetails: + type: string + ErrorDescription: + type: string + + Unauthorized: + description: The requested does not have sufficient rights to perform the operation. + content: + application/json: + schema: + properties: + ErrorCode: + type: integer + enum: + - 0 # Success + - 1 # PASSWORD_CHANGE_REQUIRED, + - 2 # INVALID_CREDENTIALS, + - 3 # PASSWORD_ALREADY_USED, + - 4 # USERNAME_PENDING_VERIFICATION, + - 5 # PASSWORD_INVALID, + - 6 # INTERNAL_ERROR, + - 7 # ACCESS_DENIED, + - 8 # INVALID_TOKEN + - 9 # EXPIRED_TOKEN + - 10 # RATE_LIMIT_EXCEEDED + - 11 # BAD_MFA_TRANSACTION + - 12 # MFA_FAILURE + - 13 # SECURITY_SERVICE_UNREACHABLE + ErrorDetails: + type: string + ErrorDescription: + type: string + + Success: + description: The requested operation was performed. + content: + application/json: + schema: + properties: + Operation: + type: string + Details: + type: string + Code: + type: integer + + BadRequest: + description: The requested operation failed. + content: + application/json: + schema: + properties: + ErrorCode: + type: integer + ErrorDetails: + type: string + ErrorDescription: + type: integer + + schemas: + + ObjectInfo: + type: object + properties: + id: + type: string + format: uuid + name: + type: string + description: + type: string + notes: + type: array + items: + $ref: '#/components/schemas/NoteInfo' + created: + type: integer + format: int64 + modified: + type: integer + format: int64 + tags: + type: array + items: + type: integer + format: int64 + + # uuids: mpe: + ManagementPolicyEntry: + type: object + properties: + users: + type: array + items: + type: string + resources: + description: this is a list of UUID and UUID Patterns to control by this policy + type: array + items: + type: string + access: + type: array + items: + type: string + enum: + - NOACCESS + - READ + - MODIFY + - DELETE + - LIST + - CREATE + - FULL + policy: + description: A JSON document describing the policy + type: string + + # uuids: mpp: + ManagementPolicy: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + entries: + type: array + items: + $ref: '#/components/schemas/ManagementPolicyEntry' + inUse: + type: array + items: + type: string + format: uuid + example: each uuid is preceded by ent, or ven to say that the elemenet is entity or venue + entity: + type: string + format: uuid + venue: + type: string + format: uuid + + ManagementPolicyList: + type: object + properties: + policies: + type: array + items: + $ref: '#/components/schemas/ManagementPolicy' + + # uuids: ent: + Entity: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + parent: + description: If empty, then this is the root entity, otherwise this points to a parent entity + type: string + format: uuid + children: + type: array + items: + type: string + format: uuid + venues: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + contacts: + description: The list of UUID of the contacts for the entity + type: array + items: + type: string + format: uuid + locations: + description: The list of UUID of the locations associated with thit entiry + type: array + items: + type: string + format: uuid + managementPolicy: + type: string + format: uuid + deviceConfiguration: + type: string + format: uuid + devices: + type: array + items: + type: string + format: uuid + managementPolicies: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + variables: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + managementRoles: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + maps: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + configurations: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + rrm: + type: string + enum: + - off + - on + - inherit + sourceIP: + $ref: '#/components/schemas/StringList' + + EntityList: + type: object + properties: + entities: + type: array + items: + $ref: '#/components/schemas/Entity' + + DiGraphEntry: + type: object + properties: + parent: + type: string + format: uuid + child: + type: string + format: uuid + + DiGraph: + type: array + items: + $ref: '#/components/schemas/DiGraphEntry' + + # uuids: ven: + Venue: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + entity: + type: string + format: uuid + parent: + type: string + format: uuid + children: + type: array + items: + type: string + format: uuid + managementPolicy: + type: string + format: uuid + devices: + type: array + items: + type: string + format: uuid + topology: + $ref: '#/components/schemas/DiGraph' + design: + type: string + deviceConfiguration: + type: string + format: uuid + contacts: + type: array + items: + type: string + format: uuid + location: + type: string + format: uuid + rrm: + type: string + enum: + - off + - on + - inherit + sourceIP: + $ref: '#/components/schemas/StringList' + managementPolicies: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + managementRoles: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + variables: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + maps: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + configurations: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + + VenueList: + type: object + properties: + venues: + type: array + items: + $ref: '#/components/schemas/Venue' + + UserInfoDigest: + type: object + properties: + id: + type: string + format: uuid + loginId: + type: string + type: + type: string + + # uuids: mgg: + ManagementRole: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + managementPolicy: + type: string + format: uuid + users: + type: array + items: + type: string + format: uuid + inUse: + type: array + items: + type: string + format: uuid + example: each uuid is preceded by ent, or ven to say that the elemenet is entity or venue + entity: + type: string + format: uuid + venue: + type: string + format: uuid + + ManagementRoleList: + type: object + properties: + roles: + type: array + items: + $ref: '#/components/schemas/ManagementRole' + + # uuids: loc: + Location: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + type: + type: string + enum: + - SERVICE + - EQUIPMENT + - AUTO + - MANUAL + - SPECIAL + - UNKNOWN + - CORPORATE + buildingName: + type: string + addressLines: + type: array + items: + type: string + city: + type: string + state: + type: string + postal: + type: string + country: + type: string + phones: + type: array + items: + type: string + mobiles: + type: array + items: + type: string + inUse: + type: array + items: + type: string + format: uuid + example: each uuid is preceded by ent, or ven to say that the elemenet is entity or venue + entity: + type: string + format: uuid + managementPolicy: + type: string + format: uuid + geoCode: + type: string + + LocationList: + type: object + properties: + locations: + type: array + items: + $ref: '#/components/schemas/Location' + + # uuids: con: + Contact: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + type: + type: string + enum: + - SUBSCRIBER + - USER + - INSTALLER + - CSR + - MANAGER + - BUSINESSOWNER + - TECHNICIAN + - CORPORATE + title: + type: string + salutation: + type: string + firstname: + type: string + lastname: + type: string + initials: + type: string + visual: + type: string + phones: + type: array + items: + type: string + mobiles: + type: array + items: + type: string + primaryEmail: + type: string + secondaryEmail: + type: string + accessPIN: + type: string + inUse: + type: array + items: + type: string + format: uuid + entity: + type: string + format: uuid + managementPolicy: + type: string + format: uuid + + ContactList: + type: object + properties: + contacts: + type: array + items: + $ref: '#/components/schemas/Contact' + + DeviceConfigurationElement: + type: object + properties: + name: + type: string + description: + type: string + weight: + type: integer + configuration: + type: string + + DeviceConfiguration: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + managementPolicy: + type: string + format: uuid + deviceTypes: + type: array + items: + type: string + configuration: + type: array + items: + $ref: '#/components/schemas/DeviceConfigurationElement' + variables: + type: array + items: + type: string + format: uuid + inUse: + type: array + items: + type: string + format: uuid + subscriberOnly: + type: boolean + default: false + rrm: + type: string + enum: + - off + - on + - inherit + firmwareUpgrade: + type: string + example: auto or a time string of the format DOW-HH:MM + firmwareRCOnly: + type: boolean + venue: + type: string + format: uuid + entity: + type: string + format: uuid + subscriber: + type: string + format: uuid + + DeviceConfigurationList: + type: object + properties: + configurations: + type: array + items: + $ref: '#/components/schemas/DeviceConfiguration' + + InventoryTag: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + serialNumber: + type: string + deviceType: + type: string + venue: + type: string + format: uuid + entity: + type: string + format: uuid + subscriber: + type: string + format: uuid + qrCode: + type: string + geoCode: + type: string + location: + type: string + format: uuid + contact: + type: string + format: uuid + deviceConfiguration: + type: string + format: uuid + rrm: + type: string + enum: + - off + - on + - inherit + managementPolicy: + type: string + format: uuid + state: + type: string + devClass: + type: string + enum: + - any + - venue + - entity + - subscriber + locale: + type: string + minLength: 2 + maxLength: 2 + + InventoryTagList: + type: object + properties: + taglist: + type: array + items: + $ref: '#/components/schemas/InventoryTag' + + SerialNumberList: + type: object + properties: + serialNumbers: + type: array + items: + type: string + + CountAnswer: + type: object + properties: + count: + type: integer + format: int64 + + ExpandedUseEntry: + type: object + properties: + uuid: + type: string + format: uuid + name: + type: string + description: + type: string + + ExpandedUseEntryMap: + type: object + properties: + type: + type: string + entries: + type: array + items: + $ref: '#/components/schemas/ExpandedUseEntry' + + ExpandedUseEntryMapList: + type: object + properties: + entries: + type: array + items: + $ref: '#/components/schemas/ExpandedUseEntryMap' + + FirmwareOptions: + type: object + properties: + firmwareUpgrade: + type: string + example: auto or a time string of the format DOW-HH:MM + firmwareRCOnly: + type: boolean + from: + type: string + + InventoryConfigApplyResult: + type: object + properties: + appliedConfiguration: + type: string + errors: + type: array + items: + type: string + warnings: + type: array + items: + type: string + errorCode: + type: integer + + uuidList: + type: object + properties: + list: + type: array + items: + type: string + format: uuid + + ObjectACL: + type: object + properties: + users: + $ref: '#/components/schemas/uuidList' + roles: + $ref: '#/components/schemas/uuidList' + access: + type: string + enum: + - none + - read + - modify + - delete + - create + + ObjectACLList: + type: object + properties: + list: + type: array + items: + $ref: '#/components/schemas/ObjectACL' + + Map: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + entity: + type: string + format: uuid + venue: + type: string + format: uuid + managementPolicy: + type: string + format: uuid + data: + type: string + visibility: + type: string + enum: + - private + - public + - select + creator: + type: string + format: uuid + access: + $ref: '#/components/schemas/ObjectACLList' + + MapList: + type: object + properties: + list: + type: array + items: + $ref: '#/components/schemas/Map' + + + SignupEntry: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + email: + type: string + format: email + userId: + type: string + format: uuid + macAddress: + type: string + serialNumber: + type: string + created: + type: integer + format: int64 + completed: + type: integer + format: int64 + error: + type: integer + format: int64 + status: + type: string + statusCode: + type: integer + format: int64 + + Variable: + type: object + properties: + type: + type: string + enum: + - integer + - string + - float + - boolean + - variable + - json + weight: + type: integer + format: int64 + prefix: + type: string + value: + type: string + + VariableList: + type: object + properties: + variables: + type: array + items: + $ref: '#/components/schemas/Variable' + + VariableBlock: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + variables: + type: array + items: + $ref: '#/components/schemas/Variable' + entity: + type: string + format: uuid + venue: + type: string + format: uuid + subscriber: + type: string + format: uuid + inventory: + type: string + format: uuid + inUse: + type: array + items: + type: string + format: uuid + + VariableBlockList: + type: object + properties: + variableBlocks: + type: array + items: + $ref: '#/components/schemas/VariableBlock' + + ######################################################################################### + ## + ## These are endpoints that all services in the OPenWiFI stack must provide + ## + ######################################################################################### + AnyPayload: + type: object + properties: + Document: + type: string + + StringList: + type: object + properties: + list: + type: array + items: + type: string + + TagValuePair: + type: object + properties: + tag: + type: string + value: + type: string + + TagValuePairList: + type: object + properties: + tagList: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + TagIntPair: + type: object + properties: + tag: + type: string + value: + type: integer + format: int64 + + TagIntPairList: + type: object + properties: + tagList: + type: array + items: + $ref: '#/components/schemas/TagIntPair' + + SystemCommandDetails: + type: object + properties: + command: + type: string + enum: + - setloglevels + - getloglevels + - getSubSystemNames + - getLogLevelNames + - stats + parameters: + oneOf: + - $ref: '#/components/schemas/StringList' + - $ref: '#/components/schemas/TagValuePairList' + + SystemCommandResults: + type: object + oneOf: + - $ref: '#/components/schemas/StringList' + - $ref: '#/components/schemas/TagValuePairList' + + NoteInfo: + type: object + properties: + created: + type: integer + format: int64 + createdBy: + type: string + note: + type: string + + SystemInfoResults: + type: object + properties: + version: + type: string + uptime: + type: integer + format: integer64 + start: + type: integer + format: integer64 + os: + type: string + processors: + type: integer + hostname: + type: string + certificates: + type: array + items: + type: object + properties: + filename: + type: string + expires: + type: integer + format: int64 + + Dashboard: + type: object + properties: + snapshot: + type: integer + format: int64 + tenants: + $ref: '#/components/schemas/TagIntPairList' + + SystemCommandSetLogLevel: + type: object + properties: + command: + type: string + enum: + - setloglevel + subsystems: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + SystemCommandReload: + type: object + properties: + command: + type: string + enum: + - reload + subsystems: + type: array + items: + type: string + example: these are the SubSystems names retrieve with the GetSubSystemsNamesResult. + + SystemCommandGetLogLevels: + type: object + properties: + command: + type: string + enum: + - getloglevels + + SystemGetLogLevelsResult: + type: object + properties: + taglist: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + SystemCommandGetLogLevelNames: + type: object + properties: + command: + type: string + enum: + - getloglevelnames + + SystemCommandGetSubsystemNames: + type: object + properties: + command: + type: string + enum: + - getsubsystemnames + + SystemCommandGetLogLevelNamesResult: + type: object + properties: + list: + type: array + items: + type: string + + SystemGetSubSystemNamesResult: + type: object + properties: + taglist: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + +paths: + /entity: + get: + tags: + - Entities + operationId: getEntities + summary: Retrieve a list of entities. + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of devices comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: return the number of devices + name: countOnly + schema: + type: boolean + required: false + + responses: + 200: + description: Return a list of elements + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/EntityList' + - $ref: '#/components/schemas/CountAnswer' + + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /entity/{uuid}: + get: + tags: + - Entities + operationId: getEntity + summary: Retrieve a specific entity. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: When looking for the root entity, the uuid 0000-0000-0000 must be entered. + required: true + + responses: + 200: + $ref: '#/components/schemas/Entity' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + post: + tags: + - Entities + operationId: createEntity + summary: Create a specific entity. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: When creating the root entity, the uuid 0000-0000-0000 must be entered. When creating a non-root entity, uuid must be 1 + required: true + requestBody: + description: Information used to create the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/Entity' + + responses: + 200: + $ref: '#/components/schemas/Entity' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - Entities + operationId: modifyEntity + summary: Modify a specific entity. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: When modifying the root entity, the uuid 0000-0000-0000 must be entered. + required: true + requestBody: + description: Information used to modify the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/Entity' + + responses: + 200: + $ref: '#/components/schemas/Entity' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Entities + operationId: deleteEntity + summary: Delete a specific entity. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: The root entity cannot be deleted. + required: true + + responses: + 204: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /contact: + get: + tags: + - Contacts + operationId: getContacts + summary: Retrieve a list of contacts. + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of contacts comma separated + name: select + schema: + type: string + example: uuid1,uuid2,uuid3 + required: false + - in: query + description: return the number of contacts + name: countOnly + schema: + type: boolean + required: false + - in: query + description: return only the UUIDs of contacts + name: uuidOnly + schema: + type: boolean + required: false + - in: query + name: venue + schema: + type: string + format: uuid + required: false + - in: query + name: entity + schema: + type: string + format: uuid + required: false + + responses: + 200: + description: Return a list of contacts + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/ContactList' + - $ref: '#/components/schemas/CountAnswer' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /contact/{uuid}: + get: + tags: + - Contacts + operationId: getContact + summary: Retrieve a specific contact. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: expandInUse + schema: + type: boolean + required: false + + responses: + 200: + description: Success + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/Contact' + - $ref: '#/components/schemas/ExpandedUseEntryMapList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + post: + tags: + - Contacts + operationId: createContact + summary: Create a specific entity. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to create the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + + responses: + 200: + $ref: '#/components/schemas/Contact' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - Contacts + operationId: modifyContact + summary: Modify a specific contact. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to modify the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + + responses: + 200: + $ref: '#/components/schemas/Contact' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Contacts + operationId: deleteContact + summary: Delete a specific contact. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: force + schema: + type: boolean + required: true + + responses: + 204: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /location: + get: + tags: + - Locations + operationId: getLocations + summary: Retrieve a list of locations. + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of Locations comma separated + name: select + schema: + type: string + example: uuid1,uuid2,uuid3 + required: false + - in: query + description: return the number of Locations + name: countOnly + schema: + type: boolean + required: false + - in: query + description: return only the UUIDs of Locations + name: uuidOnly + schema: + type: boolean + required: false + + responses: + 200: + description: Return a list of Locations + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/LocationList' + - $ref: '#/components/schemas/CountAnswer' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /location/{uuid}: + get: + tags: + - Locations + operationId: getLocation + summary: Retrieve a specific location. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: expandInUse + schema: + type: boolean + required: false + + responses: + 200: + description: Success + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/Location' + - $ref: '#/components/schemas/ExpandedUseEntryMapList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + post: + tags: + - Locations + operationId: createLocation + summary: Create a specific location. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to create the new location + content: + application/json: + schema: + $ref: '#/components/schemas/Location' + + responses: + 200: + $ref: '#/components/schemas/Location' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - Locations + operationId: modifyLocation + summary: Modify a specific location. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to modify the new location + content: + application/json: + schema: + $ref: '#/components/schemas/Location' + + responses: + 200: + $ref: '#/components/schemas/Location' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Locations + operationId: deleteLocation + summary: Delete a specific location. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: force + schema: + type: boolean + required: true + + responses: + 204: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /inventory: + get: + tags: + - Inventory + operationId: getInventoryTags + summary: Retrieve a list of inventory. + parameters: + - in: query + name: entity + schema: + type: string + format: uuid + required: false + - in: query + name: venue + schema: + type: string + format: uuid + required: false + - in: query + name: unassigned + schema: + type: boolean + required: false + - in: query + name: deviceType + schema: + type: string + required: false + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of devices comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: only serial numbers of full device details + name: serialOnly + schema: + type: boolean + required: false + - in: query + description: return the number of devices + name: countOnly + schema: + type: boolean + required: false + - in: query + description: return extended information + name: withExtendedInfo + schema: + type: boolean + required: false + - in: query + description: return extended information + name: orderBy + schema: + type: string + example: serialNumber:a,created:d + required: false + - in: query + description: return the list of devices under RRM + name: rrmOnly + schema: + type: boolean + default: false + required: false + - in: query + description: return the list of devices under RRM + name: subscriber + schema: + type: string + format: uuid + required: false + responses: + 200: + description: Return a list of elements + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SerialNumberList' + - $ref: '#/components/schemas/InventoryTagList' + - $ref: '#/components/schemas/CountAnswer' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /inventory/{serialNumber}: + get: + tags: + - Inventory + operationId: getInventory + summary: Retrieve a specific inventory tag. + parameters: + - in: path + name: serialNumber + schema: + type: string + format: uuid + required: true + - in: query + name: config + schema: + type: boolean + required: false + - in: query + name: explain + schema: + type: boolean + required: false + - in: query + name: firmwareOptions + schema: + type: boolean + required: false + - in: query + name: applyConfiguration + schema: + type: boolean + required: false + responses: + 200: + description: Succesful retrieve configuratiopn or part of the configuration + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/InventoryTag' + - $ref: '#/components/schemas/FirmwareOptions' + - $ref: '#/components/schemas/InventoryConfigApplyResult' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + tags: + - Inventory + operationId: createInventory + summary: Create a specific Inventory. + parameters: + - in: path + name: serialNumber + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to create the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/InventoryTag' + responses: + 200: + $ref: '#/components/schemas/InventoryTag' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - Inventory + operationId: modifyInventory + summary: Modify a specific inventory. + parameters: + - in: path + name: serialNumber + schema: + type: string + format: uuid + required: true + - in: query + name: unassign + schema: + type: boolean + required: false + - in: path + name: removeSubscriber + schema: + type: string + format: uuid + required: true + + requestBody: + description: Information used to modify the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/InventoryTag' + + responses: + 200: + description: success + content: + application/json: + schema: + $ref: '#/components/schemas/InventoryTag' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Inventory + operationId: deleteInventory + summary: Delete a specific inventory. + parameters: + - in: path + name: serialNumber + schema: + type: string + format: uuid + required: true + + responses: + 204: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /venue: + get: + tags: + - Venues + operationId: getVenues + summary: Retrieve a list of venues. + parameters: + - in: query + name: entity + schema: + type: string + format: uuid + required: false + - in: query + name: venue + schema: + type: string + format: uuid + required: false + - in: query + name: unassigned + schema: + type: boolean + required: false + - in: query + name: deviceType + schema: + type: string + required: false + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of Venues comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: only serial numbers of full device details + name: serialOnly + schema: + type: boolean + required: false + - in: query + description: return the number of devices + name: countOnly + schema: + type: boolean + required: false + + responses: + 200: + description: Return a list of venues. + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/VenueList' + - $ref: '#/components/schemas/CountAnswer' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /venue/{uuid}: + get: + tags: + - Venues + operationId: getVenue + summary: Retrieve a specific venue. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + + responses: + 200: + $ref: '#/components/schemas/Venue' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + post: + tags: + - Venues + operationId: createVenue + summary: Create a specific venue. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: createObjects + schema: + type: object + properties: + objects: + type: array + items: + oneOf: + - type: object + properties: + location: + $ref: '#/components/schemas/Location' + - type: object + properties: + contact: + $ref: '#/components/schemas/Contact' + required: false + requestBody: + description: Information used to create the new venue + content: + application/json: + schema: + $ref: '#/components/schemas/Venue' + + responses: + 200: + $ref: '#/components/schemas/Venue' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - Venues + operationId: modifyVenue + summary: Modify a specific venue. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to modify the new venue + content: + application/json: + schema: + $ref: '#/components/schemas/Venue' + + responses: + 200: + $ref: '#/components/schemas/Venue' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Venues + operationId: deleteVenue + summary: Delete a specific venue. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: The root entity cannot be deleted. + required: true + + responses: + 204: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /map: + get: + tags: + - Maps + operationId: getMapList + summary: Retrieve the list of maps + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Return only maps I created + name: myMaps + schema: + type: boolean + required: false + - in: query + description: Return only maps shared with Me + name: sharedWithMe + schema: + type: boolean + required: false + + responses: + 200: + description: Return a list of Venues + content: + application/json: + schema: + $ref: '#/components/schemas/MapList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /map/{uuid}: + get: + tags: + - Maps + operationId: getMap + summary: Retrieve a specific map. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + + responses: + 200: + description: Successfull retrieval of a map + content: + application/json: + schema: + $ref: '#/components/schemas/Map' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + post: + tags: + - Maps + operationId: createMap + summary: Create a specific map. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to create the new policy + content: + application/json: + schema: + $ref: '#/components/schemas/Map' + + responses: + 200: + $ref: '#/components/schemas/Map' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - Maps + operationId: modifyMap + summary: Modify a specific map. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to modify a map + content: + application/json: + schema: + $ref: '#/components/schemas/Map' + + responses: + 200: + $ref: '#/components/schemas/ManagementPolicy' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Maps + operationId: deleteMap + summary: Delete a specific map. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /managementPolicy: + get: + tags: + - Management Policies + operationId: getPolicies + summary: Get a list of policies. + parameters: + - in: query + name: entity + schema: + type: string + format: uuid + required: false + - in: query + name: venue + schema: + type: string + format: uuid + required: false + - in: query + name: unassigned + schema: + type: boolean + required: false + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of policies comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: return the number of policies + name: countOnly + schema: + type: boolean + required: false + + responses: + 200: + description: Return a list of Venues + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/ManagementPolicyList' + - $ref: '#/components/schemas/CountAnswer' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /managementPolicy/{uuid}: + get: + tags: + - Management Policies + operationId: getManagementPolicy + summary: Retrieve a specific policy. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: expandInUse + schema: + type: boolean + required: false + + responses: + 200: + description: Succesful retrieve a management policy + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/ManagementPolicy' + - $ref: '#/components/schemas/ExpandedUseEntryMapList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + post: + tags: + - Management Policies + operationId: createManagementPolicy + summary: Create a specific policy. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to create the new policy + content: + application/json: + schema: + $ref: '#/components/schemas/ManagementPolicy' + + responses: + 200: + $ref: '#/components/schemas/ManagementPolicy' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - Management Policies + operationId: modifyManagementPolicy + summary: Modify a specific policy. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to modify the new policy. + content: + application/json: + schema: + $ref: '#/components/schemas/ManagementPolicy' + + responses: + 200: + $ref: '#/components/schemas/ManagementPolicy' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Management Policies + operationId: deleteManagementPolicy + summary: Delete a specific policy. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: The root entity cannot be deleted. + required: true + + responses: + 204: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /managementRole: + get: + tags: + - Management Roles + operationId: getManagementRoles + summary: Retrieve a list of management roles. + parameters: + - in: query + name: entity + schema: + type: string + format: uuid + required: false + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of devices comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: return the number of roles + name: countOnly + schema: + type: boolean + required: false + + responses: + 200: + description: Return a list of elements + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/ManagementRoleList' + - $ref: '#/components/schemas/CountAnswer' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /managementRole/{uuid}: + get: + tags: + - Management Roles + operationId: getManagementRole + summary: Retrieve a specific management role. + parameters: + - in: path + name: uuid + required: true + schema: + type: string + format: uuid + - in: query + name: expandInUse + schema: + type: boolean + required: false + responses: + 200: + description: Success + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/ManagementRole' + - $ref: '#/components/schemas/ExpandedUseEntryMapList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + tags: + - Management Roles + operationId: createManagementRole + summary: Create a specific management role. + parameters: + - in: path + name: uuid + required: true + schema: + type: string + format: uuid + example: during creation, must be set to 1. The real uuid will be returned in the created object + requestBody: + description: Information used to create management role + content: + application/json: + schema: + $ref: '#/components/schemas/ManagementRole' + + responses: + 200: + $ref: '#/components/schemas/ManagementRole' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - Management Roles + operationId: modifyManagementRole + summary: Modify a specific management role. + parameters: + - in: path + name: uuid + required: true + schema: + type: string + format: uuid + requestBody: + description: Information used to modify management role + content: + application/json: + schema: + $ref: '#/components/schemas/ManagementRole' + + responses: + 200: + $ref: '#/components/schemas/ManagementRole' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + tags: + - Management Roles + operationId: deleteManagementRole + summary: Delete a specific management role. + parameters: + - in: path + name: uuid + required: true + schema: + type: string + format: uuid + responses: + 204: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /configurations: + get: + tags: + - Configurations + operationId: getConfigurations + summary: Retrieve a list of configurations. + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of devices comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: return the number of devices + name: countOnly + schema: + type: boolean + required: false + - in: query + name: venue + schema: + type: string + format: uuid + required: false + - in: query + name: entity + schema: + type: string + format: uuid + required: false + + responses: + 200: + description: Return a list of elements + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/DeviceConfigurationList' + - $ref: '#/components/schemas/CountAnswer' + + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /configurations/{uuid}: + get: + tags: + - Configurations + operationId: geConfiguration + summary: Retrieve a specific configuration. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: When looking for the root entity, the uuid 0000-0000-0000 must be entered. + required: true + - in: query + name: expandInUse + schema: + type: boolean + required: false + + responses: + 200: + description: Success + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/DeviceConfiguration' + - $ref: '#/components/schemas/ExpandedUseEntryMapList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + post: + tags: + - Configurations + operationId: createConfiguration + summary: Create a specific configuration. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: When creating the root entity, the uuid 0000-0000-0000 must be entered. When creating a non-root entity, uuid must be 1 + required: true + - in: query + name: validateOnly + schema: + type: boolean + required: false + requestBody: + description: Information used to create the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/DeviceConfiguration' + + responses: + 200: + $ref: '#/components/schemas/DeviceConfiguration' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - Configurations + operationId: modifyConfiguration + summary: Modify a specific configuration. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: When modifying the root entity, the uuid 0000-0000-0000 must be entered. + required: true + requestBody: + description: Information used to modify the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/DeviceConfiguration' + + responses: + 200: + $ref: '#/components/schemas/DeviceConfiguration' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Configurations + operationId: deleteConfiguration + summary: Delete a specific configuration. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: The root entity cannot be deleted. + required: true + + responses: + 204: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /iptocountry: + get: + tags: + - Utility + summary: Get the country code for an IP address + operationId: getIpToCountry + parameters: + - in: query + name: iplist + schema: + type: string + example: + 10.2.2.2,10.3.4.3 + required: true + responses: + 200: + description: List of country codes. + content: + application/json: + schema: + type: object + properties: + enabled: + type: boolean + countryCodes: + type: array + items: + type: string + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /signup: + get: + tags: + - Subscriber Registration + summary: This call allows someone to get the status of a signup. + operationId: getSignup + parameters: + - in: query + name: email + schema: + type: string + format: email + required: false + - in: query + name: macAddress + schema: + type: string + required: false + - in: query + name: signupUUID + schema: + type: string + format: uuid + required: false + - in: query + name: dashboard + schema: + type: boolean + default: false + required: false + - in: query + name: deviceID + schema: + type: string + required: false + responses: + 200: + description: Successfull completion + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SignupEntry' + - $ref: '#/components/schemas/Dashboard' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Subscriber Registration + summary: This call allows someone to delete a specific signUp or all signups according to serialNumber of email address + operationId: deleteSignup + parameters: + - in: query + name: email + schema: + type: string + format: email + required: false + - in: query + name: macAddress + schema: + type: string + required: false + - in: query + name: signupUUID + schema: + type: string + format: uuid + required: false + - in: query + name: deviceID + schema: + type: string + required: false + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + post: + tags: + - Subscriber Registration + summary: This call allows a new subscriber to register themselves and their devices. + operationId: postSignup + parameters: + - in: query + name: email + schema: + type: string + format: email + required: true + - in: query + name: macAddress + schema: + type: string + required: true + - in: query + name: deviceID + schema: + type: string + required: false + responses: + 200: + $ref: '#/components/schemas/SignupEntry' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - Subscriber Registration + summary: modify the signup command in play + operationId: modifySignup + parameters: + - in: query + name: signupUUID + schema: + type: string + format: uuid + required: true + - in: query + name: operation + schema: + type: string + enum: + - cancel + - emailVerified + - deviceVerified + required: true + requestBody: + content: + application/json: + schema: + type: object + properties: + reason: + type: string + time: + type: integer + format: int64 + errorCode: + type: integer + format: int32 + status: + type: string + required: false + + responses: + 200: + $ref: '#/components/schemas/SignupEntry' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /variables: + get: + tags: + - Variable Configuration Blocks + summary: Retrieve lists of control blocks + operationId: getVariableList + parameters: + - in: query + name: venue + schema: + type: string + format: uuid + required: false + - in: query + name: entity + schema: + type: string + format: uuid + required: false + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of devices comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: return the number of devices + name: countOnly + schema: + type: boolean + required: false + responses: + 200: + $ref: '#/components/schemas/VariableBlockList' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + ######################################################################################### + ## + ## These are endpoints that all services in the OpenWiFi stack must provide + ## + ######################################################################################### + /dashboard: + get: + tags: + - Dashboards + summary: Get the last version of the dashboard. + operationId: getDeviceDashboard + responses: + 200: + $ref: '#/components/schemas/Dashboard' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /system: + post: + tags: + - System Commands + summary: Perform some system wide commands. + operationId: systemCommand + requestBody: + description: Command details + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemCommandSetLogLevel' + - $ref: '#/components/schemas/SystemCommandReload' + - $ref: '#/components/schemas/SystemCommandGetLogLevels' + - $ref: '#/components/schemas/SystemCommandGetLogLevelNames' + - $ref: '#/components/schemas/SystemCommandGetSubsystemNames' + responses: + 200: + description: Successful command execution + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemGetLogLevelsResult' + - $ref: '#/components/schemas/SystemCommandGetLogLevelNamesResult' + - $ref: '#/components/schemas/SystemGetSubSystemNamesResult' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + get: + tags: + - System Commands + summary: Retrieve different values from the running service. + operationId: getSystemCommand + parameters: + - in: query + description: Get a value + name: command + schema: + type: string + enum: + - info + required: true + + responses: + 200: + description: Successful command execution + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemInfoResults' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' diff --git a/.gitbook/assets/owprov.yaml b/.gitbook/assets/owprov.yaml new file mode 100644 index 0000000..f1ba029 --- /dev/null +++ b/.gitbook/assets/owprov.yaml @@ -0,0 +1,4342 @@ +openapi: 3.0.1 +info: + title: OpenWiFi Provisioning Model + description: Definitions and APIs to manages an OpenWiFi network. + version: 2.5.0 + license: + name: BSD3 + url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE + +servers: + - url: 'https://localhost:16005/api/v1' + +security: + - bearerAuth: [] + - ApiKeyAuth: [] + +components: + securitySchemes: + ApiKeyAuth: + type: apiKey + in: header + name: X-API-KEY + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + + responses: + NotFound: + description: The specified resource was not found. + content: + application/json: + schema: + properties: + ErrorCode: + type: integer + ErrorDetails: + type: string + ErrorDescription: + type: string + + Unauthorized: + description: The requested does not have sufficient rights to perform the operation. + content: + application/json: + schema: + properties: + ErrorCode: + type: integer + enum: + - 0 # Success + - 1 # PASSWORD_CHANGE_REQUIRED, + - 2 # INVALID_CREDENTIALS, + - 3 # PASSWORD_ALREADY_USED, + - 4 # USERNAME_PENDING_VERIFICATION, + - 5 # PASSWORD_INVALID, + - 6 # INTERNAL_ERROR, + - 7 # ACCESS_DENIED, + - 8 # INVALID_TOKEN + - 9 # EXPIRED_TOKEN + - 10 # RATE_LIMIT_EXCEEDED + - 11 # BAD_MFA_TRANSACTION + - 12 # MFA_FAILURE + - 13 # SECURITY_SERVICE_UNREACHABLE + ErrorDetails: + type: string + ErrorDescription: + type: string + + Success: + description: The requested operation was performed. + content: + application/json: + schema: + properties: + Operation: + type: string + Details: + type: string + Code: + type: integer + + BadRequest: + description: The requested operation failed. + content: + application/json: + schema: + properties: + ErrorCode: + type: integer + ErrorDetails: + type: string + ErrorDescription: + type: integer + + schemas: + + ObjectInfo: + type: object + properties: + id: + type: string + format: uuid + name: + type: string + description: + type: string + notes: + type: array + items: + $ref: '#/components/schemas/NoteInfo' + created: + type: integer + format: int64 + modified: + type: integer + format: int64 + tags: + type: array + items: + type: integer + format: int64 + + # uuids: mpe: + ManagementPolicyEntry: + type: object + properties: + users: + type: array + items: + type: string + resources: + description: this is a list of UUID and UUID Patterns to control by this policy + type: array + items: + type: string + access: + type: array + items: + type: string + enum: + - NOACCESS + - READ + - MODIFY + - DELETE + - LIST + - CREATE + - FULL + policy: + description: A JSON document describing the policy + type: string + + # uuids: mpp: + ManagementPolicy: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + entries: + type: array + items: + $ref: '#/components/schemas/ManagementPolicyEntry' + inUse: + type: array + items: + type: string + format: uuid + example: each uuid is preceded by ent, or ven to say that the elemenet is entity or venue + entity: + type: string + format: uuid + venue: + type: string + format: uuid + + ManagementPolicyList: + type: object + properties: + policies: + type: array + items: + $ref: '#/components/schemas/ManagementPolicy' + + DeviceRules: + type: object + properties: + rcOnly: + type: string + enum: + - yes + - no + - inherit + rrm: + type: string + enum: + - yes + - no + - inherit + firmwareUpgrade: + type: string + enum: + - yes + - no + - inherit + + # uuids: ent: + Entity: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + parent: + description: If empty, then this is the root entity, otherwise this points to a parent entity + type: string + format: uuid + children: + type: array + items: + type: string + format: uuid + venues: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + contacts: + description: The list of UUID of the contacts for the entity + type: array + items: + type: string + format: uuid + locations: + description: The list of UUID of the locations associated with thit entiry + type: array + items: + type: string + format: uuid + managementPolicy: + type: string + format: uuid + deviceConfiguration: + type: string + format: uuid + devices: + type: array + items: + type: string + format: uuid + managementPolicies: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + variables: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + managementRoles: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + maps: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + configurations: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + deviceRules: + $ref: '#/components/schemas/DeviceRules' + sourceIP: + $ref: '#/components/schemas/StringList' + defaultEntity: + type: boolean + default: false + type: + type: string + enum: + - normal + - subscriber + default: normal + + EntityList: + type: object + properties: + entities: + type: array + items: + $ref: '#/components/schemas/Entity' + + DiGraphEntry: + type: object + properties: + parent: + type: string + format: uuid + child: + type: string + format: uuid + + DiGraph: + type: array + items: + $ref: '#/components/schemas/DiGraphEntry' + + # uuids: ven: + Venue: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + entity: + type: string + format: uuid + parent: + type: string + format: uuid + children: + type: array + items: + type: string + format: uuid + managementPolicy: + type: string + format: uuid + devices: + type: array + items: + type: string + format: uuid + topology: + $ref: '#/components/schemas/DiGraph' + design: + type: string + deviceConfiguration: + type: string + format: uuid + contacts: + type: array + items: + type: string + format: uuid + location: + type: string + format: uuid + deviceRules: + $ref: '#/components/schemas/DeviceRules' + sourceIP: + $ref: '#/components/schemas/StringList' + managementPolicies: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + managementRoles: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + variables: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + maps: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + configurations: + description: The list of UUID of the venues for this entity + type: array + items: + type: string + format: uuid + boards: + description: The list of OWAnalytics Boards created for this venue + type: array + items: + type: string + format: uuid + + VenueList: + type: object + properties: + venues: + type: array + items: + $ref: '#/components/schemas/Venue' + + UserInfoDigest: + type: object + properties: + id: + type: string + format: uuid + loginId: + type: string + type: + type: string + + # uuids: mgg: + ManagementRole: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + managementPolicy: + type: string + format: uuid + users: + type: array + items: + type: string + format: uuid + inUse: + type: array + items: + type: string + format: uuid + example: each uuid is preceded by ent, or ven to say that the elemenet is entity or venue + entity: + type: string + format: uuid + venue: + type: string + format: uuid + + ManagementRoleList: + type: object + properties: + roles: + type: array + items: + $ref: '#/components/schemas/ManagementRole' + + # uuids: loc: + Location: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + type: + type: string + enum: + - SERVICE + - EQUIPMENT + - AUTO + - MANUAL + - SPECIAL + - UNKNOWN + - CORPORATE + buildingName: + type: string + addressLines: + type: array + items: + type: string + city: + type: string + state: + type: string + postal: + type: string + country: + type: string + phones: + type: array + items: + type: string + mobiles: + type: array + items: + type: string + inUse: + type: array + items: + type: string + format: uuid + example: each uuid is preceded by ent, or ven to say that the elemenet is entity or venue + entity: + type: string + format: uuid + managementPolicy: + type: string + format: uuid + geoCode: + type: string + + LocationList: + type: object + properties: + locations: + type: array + items: + $ref: '#/components/schemas/Location' + + OperatorLocation: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + type: + type: string + enum: + - SERVICE + - EQUIPMENT + - AUTO + - MANUAL + - SPECIAL + - UNKNOWN + - CORPORATE + buildingName: + type: string + addressLines: + type: array + items: + type: string + city: + type: string + state: + type: string + postal: + type: string + country: + type: string + phones: + type: array + items: + type: string + mobiles: + type: array + items: + type: string + operatorId: + type: string + format: uuid + subscriberDeviceId: + type: string + format: uuid + geoCode: + type: string + + OperatorLocationList: + type: object + properties: + locations: + type: array + items: + $ref: '#/components/schemas/OperatorLocation' + + SubLocation: + type: object + properties: + type: + type: string + enum: + - SERVICE + - EQUIPMENT + - AUTO + - MANUAL + - SPECIAL + - UNKNOWN + - CORPORATE + buildingName: + type: string + addressLines: + type: array + items: + type: string + city: + type: string + state: + type: string + postal: + type: string + country: + type: string + phones: + type: array + items: + type: string + mobiles: + type: array + items: + type: string + geoCode: + type: string + + # uuids: con: + Contact: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + type: + type: string + enum: + - SUBSCRIBER + - USER + - INSTALLER + - CSR + - MANAGER + - BUSINESSOWNER + - TECHNICIAN + - CORPORATE + title: + type: string + salutation: + type: string + firstname: + type: string + lastname: + type: string + initials: + type: string + visual: + type: string + phones: + type: array + items: + type: string + mobiles: + type: array + items: + type: string + primaryEmail: + type: string + secondaryEmail: + type: string + accessPIN: + type: string + inUse: + type: array + items: + type: string + format: uuid + entity: + type: string + format: uuid + managementPolicy: + type: string + format: uuid + + ContactList: + type: object + properties: + contacts: + type: array + items: + $ref: '#/components/schemas/Contact' + + OperatorContact: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + type: + type: string + enum: + - SUBSCRIBER + - USER + - INSTALLER + - CSR + - MANAGER + - BUSINESSOWNER + - TECHNICIAN + - CORPORATE + title: + type: string + salutation: + type: string + firstname: + type: string + lastname: + type: string + initials: + type: string + visual: + type: string + phones: + type: array + items: + type: string + mobiles: + type: array + items: + type: string + primaryEmail: + type: string + secondaryEmail: + type: string + accessPIN: + type: string + operatorId: + type: string + format: uuid + subscriberDeviceId: + type: string + format: uuid + + OperatorContactList: + type: object + properties: + contacts: + type: array + items: + $ref: '#/components/schemas/OperatorContact' + + SubContact: + type: object + properties: + type: + type: string + enum: + - SUBSCRIBER + - USER + - INSTALLER + - CSR + - MANAGER + - BUSINESSOWNER + - TECHNICIAN + - CORPORATE + title: + type: string + salutation: + type: string + firstname: + type: string + lastname: + type: string + initials: + type: string + visual: + type: string + phones: + type: array + items: + type: string + mobiles: + type: array + items: + type: string + primaryEmail: + type: string + secondaryEmail: + type: string + accessPIN: + type: string + + DeviceConfigurationElement: + type: object + properties: + name: + type: string + description: + type: string + weight: + type: integer + configuration: + type: string + + DeviceConfiguration: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + managementPolicy: + type: string + format: uuid + deviceTypes: + type: array + items: + type: string + configuration: + type: array + items: + $ref: '#/components/schemas/DeviceConfigurationElement' + variables: + type: array + items: + type: string + format: uuid + inUse: + type: array + items: + type: string + format: uuid + subscriberOnly: + type: boolean + default: false + deviceRules: + $ref: '#/components/schemas/DeviceRules' + venue: + type: string + format: uuid + entity: + type: string + format: uuid + subscriber: + type: string + format: uuid + + DeviceConfigurationList: + type: object + properties: + configurations: + type: array + items: + $ref: '#/components/schemas/DeviceConfiguration' + + InventoryTag: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + serialNumber: + type: string + deviceType: + type: string + venue: + type: string + format: uuid + entity: + type: string + format: uuid + subscriber: + type: string + format: uuid + qrCode: + type: string + geoCode: + type: string + location: + type: string + format: uuid + contact: + type: string + format: uuid + deviceConfiguration: + type: string + format: uuid + deviceRules: + $ref: '#/components/schemas/DeviceRules' + managementPolicy: + type: string + format: uuid + state: + type: string + devClass: + type: string + enum: + - any + - venue + - entity + - subscriber + locale: + type: string + minLength: 2 + maxLength: 2 + + VenueDeviceList: + type: object + properties: + id: + type: string + format: uuid + name: + type: string + description: + type: string + devices: + type: array + items: + type: string + + InventoryTagList: + type: object + properties: + taglist: + type: array + items: + $ref: '#/components/schemas/InventoryTag' + + SerialNumberList: + type: object + properties: + serialNumbers: + type: array + items: + type: string + + CountAnswer: + type: object + properties: + count: + type: integer + format: int64 + + ExpandedUseEntry: + type: object + properties: + uuid: + type: string + format: uuid + name: + type: string + description: + type: string + + ExpandedUseEntryMap: + type: object + properties: + type: + type: string + entries: + type: array + items: + $ref: '#/components/schemas/ExpandedUseEntry' + + ExpandedUseEntryMapList: + type: object + properties: + entries: + type: array + items: + $ref: '#/components/schemas/ExpandedUseEntryMap' + + FirmwareOptions: + type: object + properties: + firmwareUpgrade: + type: string + example: auto or a time string of the format DOW-HH:MM + firmwareRCOnly: + type: boolean + from: + type: string + + InventoryConfigApplyResult: + type: object + properties: + appliedConfiguration: + type: string + errors: + type: array + items: + type: string + warnings: + type: array + items: + type: string + errorCode: + type: integer + + uuidList: + type: object + properties: + list: + type: array + items: + type: string + format: uuid + + ObjectACL: + type: object + properties: + users: + $ref: '#/components/schemas/uuidList' + roles: + $ref: '#/components/schemas/uuidList' + access: + type: string + enum: + - none + - read + - modify + - delete + - create + + ObjectACLList: + type: object + properties: + list: + type: array + items: + $ref: '#/components/schemas/ObjectACL' + + Map: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + entity: + type: string + format: uuid + venue: + type: string + format: uuid + managementPolicy: + type: string + format: uuid + data: + type: string + visibility: + type: string + enum: + - private + - public + - select + creator: + type: string + format: uuid + access: + $ref: '#/components/schemas/ObjectACLList' + + MapList: + type: object + properties: + list: + type: array + items: + $ref: '#/components/schemas/Map' + + + SignupEntry: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + email: + type: string + format: email + userId: + type: string + format: uuid + operatorId: + type: string + format: uuid + macAddress: + type: string + serialNumber: + type: string + created: + type: integer + format: int64 + completed: + type: integer + format: int64 + error: + type: integer + format: int64 + status: + type: string + statusCode: + type: integer + format: int64 + registrationId: + type: string + minLength: 4 + maxLength: 16 + + Variable: + type: object + properties: + type: + type: string + enum: + - integer + - string + - float + - boolean + - variable + - json + weight: + type: integer + format: int64 + prefix: + type: string + value: + type: string + + VariableList: + type: object + properties: + variables: + type: array + items: + $ref: '#/components/schemas/Variable' + + VariableBlock: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + variables: + type: array + items: + $ref: '#/components/schemas/Variable' + entity: + type: string + format: uuid + venue: + type: string + format: uuid + subscriber: + type: string + format: uuid + inventory: + type: string + format: uuid + inUse: + type: array + items: + type: string + format: uuid + + VariableBlockList: + type: object + properties: + variableBlocks: + type: array + items: + $ref: '#/components/schemas/VariableBlock' + + ServiceClass: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + operatorId: + type: string + format: uuid + cost: + type: number + currency: + type: string + minLength: 3 + maxLength: 3 + managementPolicy: + type: string + format: uuid + period: + type: string + enum: + - hourly + - daily + - monthly + - yearly + - quarterly + - lifetime + - custom1 + - custom2 + - custom3 + - custom4 + default: monthly + billingCode: + type: string + variables: + type: array + items: + $ref: '#/components/schemas/Variable' + defaultService: + type: boolean + default: false + + ServiceClassList: + type: object + properties: + serviceClasses: + type: array + items: + $ref: '#/components/schemas/ServiceClass' + + Operator: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + variables: + type: array + items: + $ref: '#/components/schemas/Variable' + defaultOperator: + type: boolean + default: false + deviceRules: + $ref: '#/components/schemas/DeviceRules' + managementPolicy: + type: string + format: uuid + managementRoles: + $ref: '#/components/schemas/ManagementRoleList' + sourceIP: + $ref: '#/components/schemas/StringList' + registrationId: + type: string + minLength: 4 + maxLength: 16 + + OperatorList: + type: object + properties: + operators: + type: array + items: + $ref: '#/components/schemas/Operator' + + SubscriberDevice: + type: object + properties: + allOf: + $ref: '#/components/schemas/ObjectInfo' + serialNumber: + type: string + realMacAddress: + type: string + operatorId: + type: string + format: uuid + deviceType: + type: string + subscriberId: + type: string + format: uuid + qrCode: + type: string + geoCode: + type: string + location: + $ref: '#/components/schemas/SubLocation' + contact: + $ref: '#/components/schemas/SubContact' + deviceRules: + $ref: '#/components/schemas/DeviceRules' + state: + type: string + locale: + type: string + minLength: 2 + maxLength: 2 + managementPolicy: + type: string + format: uuid + suspended: + type: boolean + default: false + configuration: + type: array + items: + $ref: '#/components/schemas/DeviceConfigurationElement' + serviceClass: + type: string + format: uuid + billingCode: + type: string + + SubscriberDeviceList: + type: object + properties: + subscriberDevices: + type: array + items: + $ref: '#/components/schemas/SubscriberDevice' + + ######################################################################################### + ## + ## These are endpoints that all services in the OPenWiFI stack must provide + ## + ######################################################################################### + AnyPayload: + type: object + properties: + Document: + type: string + + StringList: + type: object + properties: + list: + type: array + items: + type: string + + TagValuePair: + type: object + properties: + tag: + type: string + value: + type: string + + TagValuePairList: + type: object + properties: + tagList: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + TagIntPair: + type: object + properties: + tag: + type: string + value: + type: integer + format: int64 + + TagIntPairList: + type: object + properties: + tagList: + type: array + items: + $ref: '#/components/schemas/TagIntPair' + + SystemCommandDetails: + type: object + properties: + command: + type: string + enum: + - setloglevels + - getloglevels + - getSubSystemNames + - getLogLevelNames + - stats + parameters: + oneOf: + - $ref: '#/components/schemas/StringList' + - $ref: '#/components/schemas/TagValuePairList' + + SystemCommandResults: + type: object + oneOf: + - $ref: '#/components/schemas/StringList' + - $ref: '#/components/schemas/TagValuePairList' + + NoteInfo: + type: object + properties: + created: + type: integer + format: int64 + createdBy: + type: string + note: + type: string + + SystemInfoResults: + type: object + properties: + version: + type: string + uptime: + type: integer + format: integer64 + start: + type: integer + format: integer64 + os: + type: string + processors: + type: integer + hostname: + type: string + certificates: + type: array + items: + type: object + properties: + filename: + type: string + expires: + type: integer + format: int64 + + Dashboard: + type: object + properties: + snapshot: + type: integer + format: int64 + tenants: + $ref: '#/components/schemas/TagIntPairList' + + SystemCommandSetLogLevel: + type: object + properties: + command: + type: string + enum: + - setloglevel + subsystems: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + SystemCommandReload: + type: object + properties: + command: + type: string + enum: + - reload + subsystems: + type: array + items: + type: string + example: these are the SubSystems names retrieve with the GetSubSystemsNamesResult. + + SystemCommandGetLogLevels: + type: object + properties: + command: + type: string + enum: + - getloglevels + + SystemGetLogLevelsResult: + type: object + properties: + taglist: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + SystemCommandGetLogLevelNames: + type: object + properties: + command: + type: string + enum: + - getloglevelnames + + SystemCommandGetSubsystemNames: + type: object + properties: + command: + type: string + enum: + - getsubsystemnames + + SystemCommandGetLogLevelNamesResult: + type: object + properties: + list: + type: array + items: + type: string + + SystemGetSubSystemNamesResult: + type: object + properties: + taglist: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + +paths: + /entity: + get: + tags: + - Entities + operationId: getEntities + summary: Retrieve a list of entities. + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of devices comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: return the number of devices + name: countOnly + schema: + type: boolean + required: false + + responses: + 200: + description: Return a list of elements + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/EntityList' + - $ref: '#/components/schemas/CountAnswer' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /entity/{uuid}: + get: + tags: + - Entities + operationId: getEntity + summary: Retrieve a specific entity. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: When looking for the root entity, the uuid 0000-0000-0000 must be entered. + required: true + responses: + 200: + $ref: '#/components/schemas/Entity' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + tags: + - Entities + operationId: createEntity + summary: Create a specific entity. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: When creating the root entity, the uuid 0000-0000-0000 must be entered. When creating a non-root entity, uuid must be 1 + required: true + requestBody: + description: Information used to create the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/Entity' + responses: + 200: + $ref: '#/components/schemas/Entity' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + tags: + - Entities + operationId: modifyEntity + summary: Modify a specific entity. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: When modifying the root entity, the uuid 0000-0000-0000 must be entered. + required: true + requestBody: + description: Information used to modify the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/Entity' + responses: + 200: + $ref: '#/components/schemas/Entity' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + tags: + - Entities + operationId: deleteEntity + summary: Delete a specific entity. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: The root entity cannot be deleted. + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /contact: + get: + tags: + - Contacts + operationId: getContacts + summary: Retrieve a list of contacts. + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of contacts comma separated + name: select + schema: + type: string + example: uuid1,uuid2,uuid3 + required: false + - in: query + description: return the number of contacts + name: countOnly + schema: + type: boolean + required: false + - in: query + description: return only the UUIDs of contacts + name: uuidOnly + schema: + type: boolean + required: false + - in: query + name: venue + schema: + type: string + format: uuid + required: false + - in: query + name: entity + schema: + type: string + format: uuid + required: false + responses: + 200: + description: Return a list of contacts + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/ContactList' + - $ref: '#/components/schemas/CountAnswer' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /contact/{uuid}: + get: + tags: + - Contacts + operationId: getContact + summary: Retrieve a specific contact. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: expandInUse + schema: + type: boolean + required: false + + responses: + 200: + description: Success + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/Contact' + - $ref: '#/components/schemas/ExpandedUseEntryMapList' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + tags: + - Contacts + operationId: createContact + summary: Create a specific entity. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to create the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + responses: + 200: + $ref: '#/components/schemas/Contact' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + tags: + - Contacts + operationId: modifyContact + summary: Modify a specific contact. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to modify the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/Contact' + responses: + 200: + $ref: '#/components/schemas/Contact' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + tags: + - Contacts + operationId: deleteContact + summary: Delete a specific contact. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: force + schema: + type: boolean + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /location: + get: + tags: + - Locations + operationId: getLocations + summary: Retrieve a list of locations. + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of Locations comma separated + name: select + schema: + type: string + example: uuid1,uuid2,uuid3 + required: false + - in: query + description: return the number of Locations + name: countOnly + schema: + type: boolean + required: false + - in: query + description: return only the UUIDs of Locations + name: uuidOnly + schema: + type: boolean + required: false + responses: + 200: + description: Return a list of Locations + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/LocationList' + - $ref: '#/components/schemas/CountAnswer' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /location/{uuid}: + get: + tags: + - Locations + operationId: getLocation + summary: Retrieve a specific location. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: expandInUse + schema: + type: boolean + required: false + responses: + 200: + description: Success + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/Location' + - $ref: '#/components/schemas/ExpandedUseEntryMapList' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + tags: + - Locations + operationId: createLocation + summary: Create a specific location. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to create the new location + content: + application/json: + schema: + $ref: '#/components/schemas/Location' + responses: + 200: + $ref: '#/components/schemas/Location' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + tags: + - Locations + operationId: modifyLocation + summary: Modify a specific location. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to modify the new location + content: + application/json: + schema: + $ref: '#/components/schemas/Location' + responses: + 200: + $ref: '#/components/schemas/Location' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + tags: + - Locations + operationId: deleteLocation + summary: Delete a specific location. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: force + schema: + type: boolean + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /inventory: + get: + tags: + - Inventory + operationId: getInventoryTags + summary: Retrieve a list of inventory. + parameters: + - in: query + name: entity + schema: + type: string + format: uuid + required: false + - in: query + name: venue + schema: + type: string + format: uuid + required: false + - in: query + name: unassigned + schema: + type: boolean + required: false + - in: query + name: deviceType + schema: + type: string + required: false + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of devices comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: only serial numbers of full device details + name: serialOnly + schema: + type: boolean + required: false + - in: query + description: return the number of devices + name: countOnly + schema: + type: boolean + required: false + - in: query + description: return extended information + name: withExtendedInfo + schema: + type: boolean + required: false + - in: query + description: return extended information + name: orderBy + schema: + type: string + example: serialNumber:a,created:d + required: false + - in: query + description: return extended information + name: orderSpec + schema: + type: boolean + default: false + required: false + - in: query + description: return the list of devices under RRM + name: rrmOnly + schema: + type: boolean + default: false + required: false + - in: query + description: return the list of devices under RRM + name: subscriber + schema: + type: string + format: uuid + required: false + responses: + 200: + description: Return a list of elements + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SerialNumberList' + - $ref: '#/components/schemas/InventoryTagList' + - $ref: '#/components/schemas/CountAnswer' + - $ref: '#/components/schemas/StringList' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /inventory/{serialNumber}: + get: + tags: + - Inventory + operationId: getInventory + summary: Retrieve a specific inventory tag. + parameters: + - in: path + name: serialNumber + schema: + type: string + format: uuid + required: true + - in: query + name: config + schema: + type: boolean + required: false + - in: query + name: explain + schema: + type: boolean + required: false + - in: query + name: firmwareOptions + schema: + type: boolean + required: false + - in: query + name: applyConfiguration + schema: + type: boolean + required: false + - in: query + name: subscriberEntity + schema: + type: string + format: uuid + required: false + responses: + 200: + description: Succesful retrieve configuratiopn or part of the configuration + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/InventoryTag' + - $ref: '#/components/schemas/FirmwareOptions' + - $ref: '#/components/schemas/InventoryConfigApplyResult' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + tags: + - Inventory + operationId: createInventory + summary: Create a specific Inventory. + parameters: + - in: path + name: serialNumber + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to create the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/InventoryTag' + responses: + 200: + $ref: '#/components/schemas/InventoryTag' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + tags: + - Inventory + operationId: modifyInventory + summary: Modify a specific inventory. + parameters: + - in: path + name: serialNumber + schema: + type: string + format: uuid + required: true + - in: query + name: unassign + schema: + type: boolean + required: false + - in: query + name: removeSubscriber + schema: + type: string + format: uuid + required: true + + requestBody: + description: Information used to modify the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/InventoryTag' + + responses: + 200: + description: success + content: + application/json: + schema: + $ref: '#/components/schemas/InventoryTag' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + tags: + - Inventory + operationId: deleteInventory + summary: Delete a specific inventory. + parameters: + - in: path + name: serialNumber + schema: + type: string + format: uuid + required: true + + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /venue: + get: + tags: + - Venues + operationId: getVenues + summary: Retrieve a list of venues. + parameters: + - in: query + name: entity + schema: + type: string + format: uuid + required: false + - in: query + name: venue + schema: + type: string + format: uuid + required: false + - in: query + name: unassigned + schema: + type: boolean + required: false + - in: query + name: deviceType + schema: + type: string + required: false + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of Venues comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: only serial numbers of full device details + name: serialOnly + schema: + type: boolean + required: false + - in: query + description: return the number of devices + name: countOnly + schema: + type: boolean + required: false + - in: query + description: return the devices under a venue + name: getDevices + schema: + type: boolean + default: false + required: false + - in: query + description: return the devices under a venue and its children. Must select getDevices=true as well. + name: getChildren + schema: + type: boolean + default: false + required: false + responses: + 200: + description: Return a list of venues. + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/VenueList' + - $ref: '#/components/schemas/CountAnswer' + - $ref: '#/components/schemas/VenueDeviceList' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /venue/{uuid}: + get: + tags: + - Venues + operationId: getVenue + summary: Retrieve a specific venue. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + + responses: + 200: + $ref: '#/components/schemas/Venue' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + tags: + - Venues + operationId: createVenue + summary: Create a specific venue. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: createObjects + schema: + type: object + properties: + objects: + type: array + items: + oneOf: + - type: object + properties: + location: + $ref: '#/components/schemas/Location' + - type: object + properties: + contact: + $ref: '#/components/schemas/Contact' + required: false + requestBody: + description: Information used to create the new venue + content: + application/json: + schema: + $ref: '#/components/schemas/Venue' + + responses: + 200: + $ref: '#/components/schemas/Venue' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + tags: + - Venues + operationId: modifyVenue + summary: Modify a specific venue. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: updateAllDevices + schema: + type: boolean + default: false + required: false + - in: query + name: rebootAllDevices + schema: + type: boolean + default: false + required: false + - in: query + name: testUpdateOnly + schema: + type: boolean + default: false + required: false + - in: query + name: upgradeAllDevices + schema: + type: boolean + default: false + required: false + requestBody: + description: Information used to modify the new venue + content: + application/json: + schema: + $ref: '#/components/schemas/Venue' + + responses: + 200: + description: Return venue information or list of serial number updated + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/Venue' + - $ref: '#/components/schemas/SerialNumberList' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + tags: + - Venues + operationId: deleteVenue + summary: Delete a specific venue. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: The root entity cannot be deleted. + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /map: + get: + tags: + - Maps + operationId: getMapList + summary: Retrieve the list of maps + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Return only maps I created + name: myMaps + schema: + type: boolean + required: false + - in: query + description: Return only maps shared with Me + name: sharedWithMe + schema: + type: boolean + required: false + responses: + 200: + description: Return a list of Venues + content: + application/json: + schema: + $ref: '#/components/schemas/MapList' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /map/{uuid}: + get: + tags: + - Maps + operationId: getMap + summary: Retrieve a specific map. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + responses: + 200: + description: Successfull retrieval of a map + content: + application/json: + schema: + $ref: '#/components/schemas/Map' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + tags: + - Maps + operationId: createMap + summary: Create a specific map. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to create the new policy + content: + application/json: + schema: + $ref: '#/components/schemas/Map' + responses: + 200: + $ref: '#/components/schemas/Map' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + tags: + - Maps + operationId: modifyMap + summary: Modify a specific map. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to modify a map + content: + application/json: + schema: + $ref: '#/components/schemas/Map' + responses: + 200: + $ref: '#/components/schemas/ManagementPolicy' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + tags: + - Maps + operationId: deleteMap + summary: Delete a specific map. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /managementPolicy: + get: + tags: + - Management Policies + operationId: getPolicies + summary: Get a list of policies. + parameters: + - in: query + name: entity + schema: + type: string + format: uuid + required: false + - in: query + name: venue + schema: + type: string + format: uuid + required: false + - in: query + name: unassigned + schema: + type: boolean + required: false + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of policies comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: return the number of policies + name: countOnly + schema: + type: boolean + required: false + responses: + 200: + description: Return a list of Venues + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/ManagementPolicyList' + - $ref: '#/components/schemas/CountAnswer' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /managementPolicy/{uuid}: + get: + tags: + - Management Policies + operationId: getManagementPolicy + summary: Retrieve a specific policy. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: expandInUse + schema: + type: boolean + required: false + responses: + 200: + description: Succesful retrieve a management policy + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/ManagementPolicy' + - $ref: '#/components/schemas/ExpandedUseEntryMapList' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + tags: + - Management Policies + operationId: createManagementPolicy + summary: Create a specific policy. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to create the new policy + content: + application/json: + schema: + $ref: '#/components/schemas/ManagementPolicy' + responses: + 200: + $ref: '#/components/schemas/ManagementPolicy' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + tags: + - Management Policies + operationId: modifyManagementPolicy + summary: Modify a specific policy. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to modify the new policy. + content: + application/json: + schema: + $ref: '#/components/schemas/ManagementPolicy' + responses: + 200: + $ref: '#/components/schemas/ManagementPolicy' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + tags: + - Management Policies + operationId: deleteManagementPolicy + summary: Delete a specific policy. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: The root entity cannot be deleted. + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /managementRole: + get: + tags: + - Management Roles + operationId: getManagementRoles + summary: Retrieve a list of management roles. + parameters: + - in: query + name: entity + schema: + type: string + format: uuid + required: false + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of devices comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: return the number of roles + name: countOnly + schema: + type: boolean + required: false + responses: + 200: + description: Return a list of elements + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/ManagementRoleList' + - $ref: '#/components/schemas/CountAnswer' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /managementRole/{uuid}: + get: + tags: + - Management Roles + operationId: getManagementRole + summary: Retrieve a specific management role. + parameters: + - in: path + name: uuid + required: true + schema: + type: string + format: uuid + - in: query + name: expandInUse + schema: + type: boolean + required: false + responses: + 200: + description: Success + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/ManagementRole' + - $ref: '#/components/schemas/ExpandedUseEntryMapList' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + tags: + - Management Roles + operationId: createManagementRole + summary: Create a specific management role. + parameters: + - in: path + name: uuid + required: true + schema: + type: string + format: uuid + example: during creation, must be set to 1. The real uuid will be returned in the created object + requestBody: + description: Information used to create management role + content: + application/json: + schema: + $ref: '#/components/schemas/ManagementRole' + + responses: + 200: + $ref: '#/components/schemas/ManagementRole' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + tags: + - Management Roles + operationId: modifyManagementRole + summary: Modify a specific management role. + parameters: + - in: path + name: uuid + required: true + schema: + type: string + format: uuid + requestBody: + description: Information used to modify management role + content: + application/json: + schema: + $ref: '#/components/schemas/ManagementRole' + responses: + 200: + $ref: '#/components/schemas/ManagementRole' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + tags: + - Management Roles + operationId: deleteManagementRole + summary: Delete a specific management role. + parameters: + - in: path + name: uuid + required: true + schema: + type: string + format: uuid + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /configuration: + get: + tags: + - Configurations + operationId: getConfigurations + summary: Retrieve a list of configurations. + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of devices comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: return the number of devices + name: countOnly + schema: + type: boolean + required: false + - in: query + name: venue + schema: + type: string + format: uuid + required: false + - in: query + name: entity + schema: + type: string + format: uuid + required: false + responses: + 200: + description: Return a list of elements + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/DeviceConfigurationList' + - $ref: '#/components/schemas/CountAnswer' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /configuration/{uuid}: + get: + tags: + - Configurations + operationId: geConfiguration + summary: Retrieve a specific configuration. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: When looking for the root entity, the uuid 0000-0000-0000 must be entered. + required: true + - in: query + name: expandInUse + schema: + type: boolean + required: false + responses: + 200: + description: Success + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/DeviceConfiguration' + - $ref: '#/components/schemas/ExpandedUseEntryMapList' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + tags: + - Configurations + operationId: createConfiguration + summary: Create a specific configuration. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: When creating the root entity, the uuid 0000-0000-0000 must be entered. When creating a non-root entity, uuid must be 1 + required: true + - in: query + name: validateOnly + schema: + type: boolean + required: false + requestBody: + description: Information used to create the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/DeviceConfiguration' + responses: + 200: + $ref: '#/components/schemas/DeviceConfiguration' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + tags: + - Configurations + operationId: modifyConfiguration + summary: Modify a specific configuration. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: When modifying the root entity, the uuid 0000-0000-0000 must be entered. + required: true + requestBody: + description: Information used to modify the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/DeviceConfiguration' + responses: + 200: + $ref: '#/components/schemas/DeviceConfiguration' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + tags: + - Configurations + operationId: deleteConfiguration + summary: Delete a specific configuration. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: The root entity cannot be deleted. + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /iptocountry: + get: + tags: + - Utility + summary: Get the country code for an IP address + operationId: getIpToCountry + parameters: + - in: query + name: iplist + schema: + type: string + example: + 10.2.2.2,10.3.4.3 + required: true + responses: + 200: + description: List of country codes. + content: + application/json: + schema: + type: object + properties: + enabled: + type: boolean + countryCodes: + type: array + items: + type: string + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /signup: + get: + tags: + - Subscriber Registration + summary: This call allows someone to get the status of a signup. + operationId: getSignup + parameters: + - in: query + name: email + schema: + type: string + format: email + required: false + - in: query + name: macAddress + schema: + type: string + required: false + - in: query + name: signupUUID + schema: + type: string + format: uuid + required: false + - in: query + name: dashboard + schema: + type: boolean + default: false + required: false + - in: query + name: deviceID + schema: + type: string + required: false + responses: + 200: + description: Successfull completion + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SignupEntry' + - $ref: '#/components/schemas/Dashboard' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + tags: + - Subscriber Registration + summary: This call allows someone to delete a specific signUp or all signups according to serialNumber of email address + operationId: deleteSignup + parameters: + - in: query + name: email + schema: + type: string + format: email + required: false + - in: query + name: macAddress + schema: + type: string + required: false + - in: query + name: signupUUID + schema: + type: string + format: uuid + required: false + - in: query + name: deviceID + schema: + type: string + required: false + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + tags: + - Subscriber Registration + summary: This call allows a new subscriber to register themselves and their devices. + operationId: postSignup + parameters: + - in: query + name: email + schema: + type: string + format: email + required: true + - in: query + name: macAddress + schema: + type: string + required: true + - in: query + name: deviceID + schema: + type: string + required: false + - in: query + name: registrationId + schema: + type: string + required: true + responses: + 200: + $ref: '#/components/schemas/SignupEntry' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + tags: + - Subscriber Registration + summary: modify the signup command in play + operationId: modifySignup + parameters: + - in: query + name: signupUUID + schema: + type: string + format: uuid + required: true + - in: query + name: operation + schema: + type: string + enum: + - cancel + - emailVerified + - deviceVerified + required: true + requestBody: + content: + application/json: + schema: + type: object + properties: + reason: + type: string + time: + type: integer + format: int64 + errorCode: + type: integer + format: int32 + status: + type: string + required: false + responses: + 200: + $ref: '#/components/schemas/SignupEntry' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /variable: + get: + tags: + - Variable Configuration Blocks + summary: Retrieve lists of control blocks + operationId: getVariableList + parameters: + - in: query + name: venue + schema: + type: string + format: uuid + required: false + - in: query + name: entity + schema: + type: string + format: uuid + required: false + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of devices comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: return the number of devices + name: countOnly + schema: + type: boolean + required: false + responses: + 200: + $ref: '#/components/schemas/VariableBlockList' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /operator: + get: + operationId: getOperators + tags: + - Operators + summary: Retrieve the list of currently configured operators + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of operators comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: return the number of operators + name: countOnly + schema: + type: boolean + required: false + responses: + 200: + description: Successfully retrieved operator list + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/OperatorList' + - $ref: '#/components/schemas/CountAnswer' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /operator/{uuid}: + get: + operationId: getOperator + tags: + - Operators + summary: Retrieve an operator + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + responses: + 200: + $ref: '#/components/schemas/Operator' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + operationId: deleteOperator + tags: + - Operators + summary: Delete an operator + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + summary: Create a new operator + operationId: createOperator + tags: + - Operators + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: + should be set to 0 when creating a new operator + required: true + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Operator' + responses: + 200: + $ref: '#/components/schemas/Operator' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + summary: Update an existing operator + operationId: updateOperator + tags: + - Operators + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Operator' + responses: + 200: + $ref: '#/components/schemas/Operator' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /serviceClass: + get: + operationId: getServiceClasses + tags: + - ServiceClass + summary: Retrieve the list of currently configured service class + parameters: + - in: query + description: The operator + name: operatorId + schema: + type: string + format: uuid + required: true + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of operators comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: return the number of operators + name: countOnly + schema: + type: boolean + required: false + responses: + 200: + description: Successfully retrieved operator list + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/ServiceClassList' + - $ref: '#/components/schemas/CountAnswer' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /serviceClass/{uuid}: + get: + operationId: getServiceClass + tags: + - ServiceClass + summary: Retrieve a service class + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + responses: + 200: + $ref: '#/components/schemas/ServiceClass' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + operationId: deleteServiceClass + tags: + - ServiceClass + summary: Delete a service class + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + summary: Create a service class + tags: + - ServiceClass + operationId: createServiceClass + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: + should be set to 0 when creating a new operator + required: true + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceClass' + responses: + 200: + $ref: '#/components/schemas/ServiceClass' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + summary: Update a service class + tags: + - ServiceClass + operationId: updateServiceClass + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceClass' + responses: + 200: + $ref: '#/components/schemas/ServiceClass' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /subscriberDevice: + get: + operationId: getsubscriberDevices + tags: + - Subscriber Devices + summary: Retrieve the list of subscriber devices + parameters: + - in: query + description: The operator + name: operatorId + schema: + type: string + format: uuid + required: true + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of operators comma separated + name: select + schema: + type: string + example: serial1,serial2,serial3 + required: false + - in: query + description: return the number of operators + name: countOnly + schema: + type: boolean + required: false + responses: + 200: + description: list of subscriber devices + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SubscriberDeviceList' + - $ref: '#/components/schemas/CountAnswer' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /subscriberDevice/{uuid}: + get: + operationId: getSubscriberDevice + tags: + - Subscriber Devices + summary: Retrieve a subscriber device + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + responses: + 200: + $ref: '#/components/schemas/SubscriberDevice' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + operationId: deleteSubscriberDevice + tags: + - Subscriber Devices + summary: Delete a subscriber device + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + summary: Create a subscriber device + tags: + - Subscriber Devices + operationId: createSubscriberDevice + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + example: + should be set to 0 when creating a new operator + required: true + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SubscriberDevice' + responses: + 200: + $ref: '#/components/schemas/SubscriberDevice' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + summary: Update a subscriber device + tags: + - Subscriber Devices + operationId: updateSubscriberDevice + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SubscriberDevice' + responses: + 200: + $ref: '#/components/schemas/SubscriberDevice' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /operatorLocation: + get: + tags: + - Operator Locations + operationId: getOperatorLocations + summary: Retrieve a list of locations. + parameters: + - in: query + name: operatorId + schema: + type: string + format: uuid + required: true + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of Locations comma separated + name: select + schema: + type: string + example: uuid1,uuid2,uuid3 + required: false + - in: query + description: return the number of Locations + name: countOnly + schema: + type: boolean + required: false + - in: query + description: return only the UUIDs of Locations + name: uuidOnly + schema: + type: boolean + required: false + responses: + 200: + description: Return a list of Locations + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/OperatorLocationList' + - $ref: '#/components/schemas/CountAnswer' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /operatorLocation/{uuid}: + get: + tags: + - Operator Locations + operationId: getOperatorLocation + summary: Retrieve a specific location. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + responses: + 200: + $ref: '#/components/schemas/OperatorLocation' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + tags: + - Operator Locations + operationId: createOperatorLocation + summary: Create a specific location. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to create the new location + content: + application/json: + schema: + $ref: '#/components/schemas/OperatorLocation' + responses: + 200: + $ref: '#/components/schemas/OperatorLocation' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + tags: + - Operator Locations + operationId: modifyOperatorLocation + summary: Modify a specific location. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to modify the new location + content: + application/json: + schema: + $ref: '#/components/schemas/OperatorLocation' + responses: + 200: + $ref: '#/components/schemas/OperatorLocation' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + tags: + - Operator Locations + operationId: deleteOperatorLocation + summary: Delete a specific location. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: force + schema: + type: boolean + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /operatorContact: + get: + tags: + - Operator Contacts + operationId: getOperatorContacts + summary: Retrieve a list of operator contacts. + parameters: + - in: query + name: operatorId + schema: + type: string + format: uuid + required: true + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + - in: query + description: Supply a list of operator contacts comma separated + name: select + schema: + type: string + example: uuid1,uuid2,uuid3 + required: false + - in: query + description: return the number of operator contacts + name: countOnly + schema: + type: boolean + required: false + - in: query + description: return only the UUIDs of operator contacts + name: uuidOnly + schema: + type: boolean + required: false + responses: + 200: + description: Return a list of operator contacts + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/OperatorContactList' + - $ref: '#/components/schemas/CountAnswer' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /operatorContact/{uuid}: + get: + tags: + - Operator Contacts + operationId: getOperatorContact + summary: Retrieve a specific operator contact. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + responses: + 200: + $ref: '#/components/schemas/OperatorContact' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + post: + tags: + - Operator Contacts + operationId: createOperatorContact + summary: Create a specific operator contact. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to create the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/OperatorContact' + responses: + 200: + $ref: '#/components/schemas/OperatorContact' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + put: + tags: + - Operator Contacts + operationId: modifyOperatorContact + summary: Modify a specific operator contact. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + requestBody: + description: Information used to modify the new entity + content: + application/json: + schema: + $ref: '#/components/schemas/OperatorContact' + responses: + 200: + $ref: '#/components/schemas/OperatorContact' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + delete: + tags: + - Operator Contacts + operationId: deleteOperatorContact + summary: Delete a specific operator contact. + parameters: + - in: path + name: uuid + schema: + type: string + format: uuid + required: true + - in: query + name: force + schema: + type: boolean + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 400: + $ref: '#/components/responses/BadRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + + ######################################################################################### + ## + ## These are endpoints that all services in the OpenWiFi stack must provide + ## + ######################################################################################### + /dashboard: + get: + tags: + - Dashboards + summary: Get the last version of the dashboard. + operationId: getDeviceDashboard + responses: + 200: + $ref: '#/components/schemas/Dashboard' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /system: + post: + tags: + - System Commands + summary: Perform some system wide commands. + operationId: systemCommand + requestBody: + description: Command details + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemCommandSetLogLevel' + - $ref: '#/components/schemas/SystemCommandReload' + - $ref: '#/components/schemas/SystemCommandGetLogLevels' + - $ref: '#/components/schemas/SystemCommandGetLogLevelNames' + - $ref: '#/components/schemas/SystemCommandGetSubsystemNames' + responses: + 200: + description: Successful command execution + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemGetLogLevelsResult' + - $ref: '#/components/schemas/SystemCommandGetLogLevelNamesResult' + - $ref: '#/components/schemas/SystemGetSubSystemNamesResult' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + get: + tags: + - System Commands + summary: Retrieve different values from the running service. + operationId: getSystemCommand + parameters: + - in: query + description: Get a value + name: command + schema: + type: string + enum: + - info + required: true + responses: + 200: + description: Successful command execution + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemInfoResults' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' diff --git a/.gitbook/assets/owsec.yaml b/.gitbook/assets/owsec.yaml new file mode 100644 index 0000000..13f6f99 --- /dev/null +++ b/.gitbook/assets/owsec.yaml @@ -0,0 +1,1207 @@ +openapi: 3.0.1 +info: + title: uCentral Security API + description: A process to manage security logins. + version: 2.0.0 + license: + name: BSD3 + url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE + contact: + name: Arilia Support + email: ucentralsupport@arilia.com + url: https://www.ucentral.info/support + +servers: + - url: 'https://localhost:16001/api/v1' + +security: + - bearerAuth: [] + - ApiKeyAuth: [] + +components: + securitySchemes: + ApiKeyAuth: + type: apiKey + in: header + name: X-API-KEY + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + + responses: + NotFound: + description: The specified resource was not found. + content: + application/json: + schema: + properties: + ErrorCode: + type: integer + ErrorDetails: + type: string + ErrorDescription: + type: string + + Unauthorized: + description: The requested does not have sufficient rights to perform the operation. + content: + application/json: + schema: + properties: + ErrorCode: + type: integer + enum: + - 0 # Success + - 1 # PASSWORD_CHANGE_REQUIRED, + - 2 # INVALID_CREDENTIALS, + - 3 # PASSWORD_ALREADY_USED, + - 4 # USERNAME_PENDING_VERIFICATION, + - 5 # PASSWORD_INVALID, + - 6 # INTERNAL_ERROR, + - 7 # ACCESS_DENIED, + - 8 # INVALID_TOKEN + - 9 # expired token + - 10 # rate limit exceeded + ErrorDetails: + type: string + ErrorDescription: + type: string + + Success: + description: The requested operation was performed. + content: + application/json: + schema: + properties: + Operation: + type: string + Details: + type: string + Code: + type: integer + + schemas: + + WebTokenRequest: + description: User Id and password. + type: object + required: + - userId + - password + properties: + userId: + type: string + default: support@example.com + password: + type: string + default: support + newPassword: + type: string + default: support + refreshToken: + type: string + example: + userId: support@example.com + password: support + + WebTokenResult: + description: Login and Refresh Tokens to be used in subsequent API calls. + type: object + properties: + access_token: + type: string + refresh_token: + type: string + token_type: + type: string + expires_in: + type: integer + format: int32 + idle_timeout: + type: integer + format: int32 + username: + type: string + created: + type: integer + format: int64 + userMustChangePassword: + type: boolean + errorCode: + type: integer # 0 = no error, 1 = passwordAlreadyUsed, 2=invalidPassword + aclTemplate: + $ref: '#/components/schemas/WebTokenAclTemplate' + + WebTokenAclTemplate: + type: object + properties: + aclTemplate: + $ref: '#/components/schemas/AclTemplate' + + ApiKeyCreationRequest: + type: object + properties: + name: + type: string + description: + type: string + expiresOn: + type: integer + format: int64 + rights: + $ref: '#/components/schemas/AclTemplate' + + ApiKeyCreationAnswer: + type: object + properties: + UUID: + type: string + format: uuid + name: + type: string + created: + type: integer + format: int64 + expiresOn: + type: integer + format: int64 + apiKey: + type: string + rights: + $ref: '#/components/schemas/AclTemplate' + + AclTemplate: + type: object + properties: + Read: + type: boolean + ReadWrite: + type: boolean + ReadWriteCreate: + type: boolean + Delete: + type: boolean + PortalLogin: + type: boolean + + SystemEndpoint: + type: object + properties: + type: + type: string + id: + type: integer + vendor: + type: string + uri: + type: string + format: uri + authenticationType: + type: string + + SystemEndpointList: + type: object + properties: + endpoints: + type: array + items: + $ref: '#/components/schemas/SystemEndpoint' + + MobilePhoneNumber: + type: object + properties: + number: + type: string + verified: + type: boolean + primary: + type: boolean + + MfaAuthInfo: + type: object + properties: + enabled: + type: boolean + method: + type: string + enum: + - sms + - email + - voice + + UserLoginLoginExtensions: + type: object + properties: + mobiles: + type: array + items: + $ref: '#/components/schemas/MobilePhoneNumber' + mfa: + $ref: '#/components/schemas/MfaAuthInfo' + + UserInfo: + type: object + properties: + id: + type: string + format: uuid + name: + type: string + description: + type: string + avatar: + type: string + format: uri + email: + type: string + format: email + validated: + type: boolean + validationEmail: + type: string + format: email + validationDate: + type: integer + format: int64 + created: + type: integer + format: int64 + validationURI: + type: string + changePassword: + type: boolean + lastLogin: + type: integer + format: int64 + currentLoginURI: + type: string + lastPasswordChange: + type: integer + format: int64 + lastEmailCheck: + type: integer + format: int64 + currentPassword: + type: string + lastPasswords: + type: array + items: + type: string + waitingForEmailCheck: + type: boolean + notes: + type: array + items: + $ref: '#/components/schemas/NoteInfo' + location: + type: string + format: uuid + owner: + type: string + format: uuid + suspended: + type: boolean + blackListed: + type: boolean + locale: + type: string + userRole: + type: string + enum: + - root + - admin + - subscriber + - csr + - system + - installer + - noc + - accounting + oauthType: + type: string + enum: + - internal + - normal + - gmail + - facebook + - linkedin + - instagram + oauthUserInfo: + type: string + securityPolicy: + type: string + securityPolicyChange: + type: integer + format: int64 + userTypeProprietaryInfo: + $ref: '#/components/schemas/UserLoginLoginExtensions' + + UserList: + type: object + properties: + users: + type: array + items: + $ref: '#/components/schemas/UserInfo' + + EMailInfo: + type: object + properties: + from: + type: string + format: email + subject: + type: string + recipients: + type: array + items: + type: string + format: email + text: + type: string + + SMSInfo: + type: object + properties: + from: + type: string + to: + type: string + text: + type: string + + MFAChallengeRequest: + type: object + properties: + uuid: + type: string + format: uuid + question: + type: string + created: + type: integer + format: integer64 + method: + type: string + + MFAChallengeResponse: + type: object + properties: + uuid: + type: string + format: uuid + answer: + type: string + + ######################################################################################### + ## + ## These are endpoints that all services in the uCentral stack must provide + ## + ######################################################################################### + AnyPayload: + type: object + properties: + Document: + type: string + + StringList: + type: object + properties: + list: + type: array + items: + type: string + + TagValuePair: + type: object + properties: + tag: + type: string + value: + type: string + + TagValuePairList: + type: object + properties: + tagList: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + NoteInfo: + type: object + properties: + created: + type: integer + format: int64 + createdBy: + type: string + note: + type: string + + SystemCommandDetails: + type: object + properties: + command: + type: string + enum: + - setloglevels + - getloglevels + - getSubSystemNames + - getLogLevelNames + - stats + parameters: + oneOf: + - $ref: '#/components/schemas/StringList' + - $ref: '#/components/schemas/TagValuePairList' + + SystemCommandResults: + type: object + oneOf: + - $ref: '#/components/schemas/StringList' + - $ref: '#/components/schemas/TagValuePairList' + + SystemInfoResults: + type: object + properties: + version: + type: string + uptime: + type: integer + format: integer64 + start: + type: integer + format: integer64 + os: + type: string + processors: + type: integer + hostname: + type: string + certificates: + type: array + items: + type: object + properties: + filename: + type: string + expires: + type: integer + format: int64 + + ProfileAction: + type: object + properties: + resource: + type: string + access: + type: string + enum: + - NONE + - READ + - MODIFY + - DELETE + - CREATE + - TEST + - MOVE + + SecurityProfile: + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + description: + type: string + policy: + type: array + items: + $ref: '#/components/schemas/ProfileAction' + role: + type: string + notes: + type: array + items: + $ref: '#/components/schemas/NoteInfo' + + SecurityProfileList: + type: object + properties: + profiles: + type: array + items: + $ref: '#/components/schemas/SecurityProfile' + + InternalServiceInfo: + type: object + properties: + privateURI: + type: string + publicURI: + type: string + token: + type: string + + InternalSystemServices: + type: object + properties: + key: + type: string + version: + type: integer + services: + type: array + items: + $ref: '#/components/schemas/InternalServiceInfo' + + TokenValidationResult: + type: object + properties: + userInfo: + $ref: '#/components/schemas/UserInfo' + tokenInfo: + $ref: '#/components/schemas/WebTokenResult' + + SystemCommandSetLogLevel: + type: object + properties: + command: + type: string + enum: + - setloglevel + subsystems: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + SystemCommandReload: + type: object + properties: + command: + type: string + enum: + - reload + subsystems: + type: array + items: + type: string + example: these are the SubSystems names retrieve with the GetSubSystemsNamesResult. + + SystemCommandGetLogLevels: + type: object + properties: + command: + type: string + enum: + - getloglevels + + SystemGetLogLevelsResult: + type: object + properties: + taglist: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + SystemCommandGetLogLevelNames: + type: object + properties: + command: + type: string + enum: + - getloglevelnames + + SystemCommandGetSubsystemNames: + type: object + properties: + command: + type: string + enum: + - getsubsystemnames + + SystemCommandGetLogLevelNamesResult: + type: object + properties: + list: + type: array + items: + type: string + + SystemGetSubSystemNemesResult: + type: object + properties: + taglist: + type: array + items: + $ref: '#/components/schemas/TagValuePair' + + ######################################################################################### + ## + ## End of uCentral system wide values + ## + ######################################################################################### + +paths: + /oauth2: + post: + tags: + - Authentication + summary: Get access token - to be used as Bearer token header for all other API requests. + operationId: getAccessToken + parameters: + - in: query + name: newPassword + description: used when a user is trying to change her password. This will be the new password. + schema: + type: string + required: false + - in: query + name: forgotPassword + description: A user forgot her password. She needs to present her e-mail address in the userId and set this to true + schema: + type: boolean + required: false + - in: query + name: requirements + description: A user forgot her password. She needs to present her e-mail address in the userId and set this to true + schema: + type: boolean + required: false + - in: query + name: resendMFACode + schema: + type: boolean + required: false + - in: query + name: completeMFAChallenge + schema: + type: boolean + required: false + requestBody: + description: User id and password + required: true + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/WebTokenRequest' + - $ref: '#/components/schemas/MFAChallengeResponse' + responses: + 200: + description: successful operation + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/WebTokenResult' + - $ref: '#/components/schemas/MFAChallengeRequest' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /oauth2/{token}: + delete: + tags: + - Authentication + summary: Revoke a token. + operationId: removeAccessToken + parameters: + - in: path + name: token + schema: + type: + string + required: true + responses: + 204: + description: successful operation + content: + application/json: + schema: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /systemEndpoints: + get: + tags: + - Authentication + summary: Retrieve the system layout. + operationId: getSystemInfo + responses: + 200: + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/SystemEndpointList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /users: + get: + tags: + - User Management + summary: Retrieve a list of existing users as well as some information about them. + operationId: getUsers + parameters: + - in: query + name: offset + schema: + type: integer + format: int64 + required: false + - in: query + name: limit + schema: + type: integer + format: int64 + required: false + - in: query + description: Selecting this option means the newest record will be returned. Use limit to select how many. + name: filter + schema: + type: string + required: false + - in: query + description: Return only the ids. + name: idOnly + schema: + type: boolean + required: false + - in: query + description: Return only the ids. + name: select + schema: + type: string + example: id1,id2,id3,id4,id5 + required: false + responses: + 200: + $ref: '#/components/schemas/UserList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /user/{id}: + get: + tags: + - User Management + operationId: getUser + summary: Retrieve the information for a single user. + parameters: + - in: path + name: id + schema: + type: string + format: uuid + required: true + responses: + 200: + $ref: '#/components/schemas/UserInfo' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - User Management + operationId: deleteUser + summary: Delete a single user. + parameters: + - in: path + name: id + schema: + type: integer + format: int64 + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + post: + tags: + - User Management + operationId: createUser + summary: Create a single user. + parameters: + - in: path + name: id + #must be set to 0 for user creation + schema: + type: integer + format: int64 + required: true + - in: query + name: email_verification + schema: + type: boolean + required: false + requestBody: + description: User details (some fields are ignored during creation) + content: + application/json: + schema: + $ref: '#/components/schemas/UserInfo' + responses: + 200: + $ref: '#/components/schemas/UserInfo' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - User Management + operationId: updateUser + summary: Modify a single user. + parameters: + - in: path + name: id + schema: + type: integer + format: int64 + required: true + - in: query + name: email_verification + schema: + type: boolean + required: false + requestBody: + description: User details (some fields are ignored during update) + content: + application/json: + schema: + $ref: '#/components/schemas/UserInfo' + responses: + 200: + $ref: '#/components/schemas/UserInfo' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /avatar/{id}: + get: + tags: + - Avatar + operationId: getAvatar + summary: Retrieve the avatar associated with a user ID. + parameters: + - in: path + name: id + schema: + type: string + format: uuid + required: true + + responses: + 200: + description: Successfully retrieved the avatar + content: + image/jpeg: + schema: + type: string + format: binary + image/png: + schema: + type: string + format: binary + image/svg+xml: + schema: + type: string + format: binary + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + delete: + tags: + - Avatar + operationId: deleteAvatar + summary: Remove an avatar associated with a user ID. + parameters: + - in: path + name: id + schema: + type: string + format: uuid + required: true + responses: + 204: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + post: + tags: + - Avatar + operationId: createAvatar + summary: Create an avatar associated with a user ID. + parameters: + - in: path + name: id + schema: + type: string + format: uuid + required: true + requestBody: + description: User id and password + required: true + content: + image/jpeg: + schema: + type: string + format: binary + image/png: + schema: + type: string + format: binary + image/svg+xml: + schema: + type: string + format: binary + + responses: + 200: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /email: + post: + tags: + - Email + summary: Send test email with the system. + operationId: Send a test email + requestBody: + description: The requested message + content: + application/json: + schema: + $ref: '#/components/schemas/EMailInfo' + responses: + 200: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + 500: + description: Error description + content: + application/json: + schema: + type: object + properties: + errors: + type: array + items: + type: string + + /sms: + post: + tags: + - Email + summary: Send test email with the system. + operationId: Send a test SMS + parameters: + - in: query + name: validateNumber + schema: + type: boolean + required: false + - in: query + name: completeValidation + schema: + type: boolean + required: false + - in: query + name: validationCode + schema: + type: string + required: false + requestBody: + description: The requested message + content: + application/json: + schema: + $ref: '#/components/schemas/SMSInfo' + responses: + 200: + $ref: '#/components/responses/Success' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + 500: + description: Error description + content: + application/json: + schema: + type: object + properties: + errors: + type: array + items: + type: string + + ######################################################################################### + ## + ## These are endpoints that all services in the uCentral stack must provide + ## + ######################################################################################### + /securityProfiles: + get: + tags: + - Security + summary: Retrieve the list of security profiles for a specific service type. + operationId: getSecurituProfiles + parameters: + - in: query + description: Pagination start (starts at 1. If not specified, 1 is assumed) + name: offset + schema: + type: integer + required: false + - in: query + description: Maximum number of entries to return (if absent, no limit is assumed) + name: limit + schema: + type: integer + required: false + - in: query + description: Filter the results + name: filter + schema: + type: string + required: false + responses: + 200: + $ref: '#/components/schemas/SecurityProfileList' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + ######################################################################################### + ## The following calls are restricted to the private system side APIs + ######################################################################################### + /systemServices: + get: + tags: + - Security + summary: Retrieve the basic system information. This information is used between services only. + operationId: getSystemServices + responses: + 200: + $ref: '#/components/schemas/InternalSystemServices' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /validateToken: + get: + tags: + - Security + summary: Allows any microservice to validate a token and get security policy for a specific user. + operationId: validateToken + parameters: + - in: query + name: token + schema: + type: string + required: true + responses: + 200: + $ref: '#/components/schemas/TokenValidationResult' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + /system: + post: + tags: + - System Commands + summary: Perform some system wide commands. + operationId: systemCommand + requestBody: + description: Command details + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemCommandSetLogLevel' + - $ref: '#/components/schemas/SystemCommandReload' + - $ref: '#/components/schemas/SystemCommandGetLogLevels' + - $ref: '#/components/schemas/SystemCommandGetLogLevelNames' + - $ref: '#/components/schemas/SystemCommandGetSubsystemNames' + responses: + 200: + description: Successful command execution + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemGetLogLevelsResult' + - $ref: '#/components/schemas/SystemCommandGetLogLevelNamesResult' + - $ref: '#/components/schemas/SystemGetSubSystemNemesResult' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + get: + tags: + - System Commands + summary: Retrieve different values from the running service. + operationId: getSystemCommand + parameters: + - in: query + description: Get a value + name: command + schema: + type: string + enum: + - info + required: true + + responses: + 200: + description: Successful command execution + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SystemInfoResults' + 403: + $ref: '#/components/responses/Unauthorized' + 404: + $ref: '#/components/responses/NotFound' + + +######################################################################################### +## +## These are endpoints that all services in the uCentral stack must provide +## +######################################################################################### \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f0b2ced --- /dev/null +++ b/README.md @@ -0,0 +1,157 @@ +--- +description: Telecom Infra Project OpenWiFi +--- + +# OpenWiFi Release 2.7 - In Progress + +## What is OpenWiFi? + +TIP OpenWiFi is an open source community project that believes in democratizing premium Wi-Fi experiences for multiple market use cases. The TIP approach to OpenWiFi creates an open source disaggregated technology stack without any vendor lock in. + +Features normally only present in commercial enterprise WLAN offerings are available in TIP OpenWiFi. These premium Wi-Fi features enable a number of market solutions for developers, integrators and operators to explore. + +TIP OpenWiFi stack enables commercial integrations via cloud native open source services for management and network visibility combined with an open source AP firmware operating system tested nightly. + +TIP OpenWiFi Continuous Integration quality testing runs nightly exercising thousands of Wi-Fi performance, conformance and feature unit tests. + +Support for a broad range of device platforms with the ability for Community to contribute additional device support and or cloud features sets TIP OpenWiFi apart from all other open projects. + +Joining TIP and the OpenWiFi project is both free and easy. + +Learn more here: [https://telecominfraproject.com/openwifi/](https://telecominfraproject.com/openwifi/) + +### Getting Started + +The most common use cases for TIP OpenWiFi are managed WLAN most often associated with premium enterprise Wi-Fi service offerings. TIP OpenWiFi presents these premium features over a number of deployment options. + +TIP OpenWiFi devices have management and telemetry exposed via a single websocket to the OpenWiFi Gateway (OWGW) microservice. The OWGW is supported by database, message bus, and the OpenWiFi Security (OWSEC) microservice for northbound API integration. This represents the minimum to deploy TIP OpenWiFi. + +This minimum set of services enables commercial vendor integration adding TIP OpenWiFi device support to existing Wi-Fi controllers. + +Refer to the sections on SDK Installation and Overview for further information. + +For additional value added services, TIP OpenWiFi also provides User Interface, Firmware Management, Provisioning and Analytics services. All services are independently deployed and integrated based on commercial adoption model. + +See [Developer Resources](broken-reference) for API level information and [Code Repositories](openwifi-stack/repositories.md) for source code guidance. + +### High Level Features + +#### Each OpenWiFi AP offers: + +* Multiple topologies including : + * Local Breakout + * Overlay including PPPoE, L2TP, L2oGRE + * IEEE802.11s Mesh and Wireless Distribution System + * Bridging, Virtual LAN, VxLAN, NAT Gateway +* Multiple authentications including WPA, WPA2, WPA3, Enterprise Radius models, M-PSK +* Passpoint R1 and R2 Mobile Offload +* Encrypted Zero Touch Provisioning and Cloud Discovery +* Autonomous RRM and Channel Control +* Wi-Fi Agile Multiband +* Multi-VAP including topology features per VAP +* Dynamic Air Time Fairness +* Over the air EDCH QoS, WMM QoS, 802.11-2016 Enterprise QoS +* Captive Portal +* Station and Network Telemetry + + + +#### Cloud SDK in OpenWiFi offers: + +* Zero Touch Provisioning & Discovery +* Integration Northbound Interface (NBI) RESTful +* Data model driven OpenAPI design +* Enterprise Message Bus data access +* Cloud Native & Agnostic micro services + * Gateway Southbound + * Security Northbound + * Firmware Management + * Web User Interface + * Provisioning + * Analytics + +**OpenWiFi AP Detail List:** + +* Wi-Fi 5 (ac) Wi-Fi 6 (ax) Wi-Fi 6E +* Dual Bank Bootloader +* Multi-SSID per Radio +* SSID Authentications: WPA/WPA2/WPA3 - Mixed, Personal, Enterprise +* 802.1Q VLAN per SSID +* 802.1d Bridge Mode per SSID +* RADIUS Accounting, Interim-Accounting, NAS-IP, CUI +* Network Address Translation Gateway Mode Operation +* Network Time Protocol Client +* Management VLAN +* Wi-Fi 6 (ax) Specific + * BSS Coloring + * UL/DL OFDMA sub-carrier allocation + * Channel Switch Announcement +* Wi-Fi General Features + * WMM® - Wi-Fi Multi Media + * UAPSD Procedures (Unscheduled Power Save) + * Upstream/Downstream Queues & L3 DSCP + * Over The Air QoS EDCH Procedures +* WMM-Admission Control (AC) +* WMM-Power Save (PS) +* Wi-Fi Optimized Connectivity + * (ai) Fast Initial Link Support +* Wi-Fi Agile Multiband + * (k) Client Radio Resource Management - Directed Steering + * (v) Network Assisted Roaming + * (r) Fast BSS Transition +* Protected Management Frames (PMF) + * (w) Management Frame Encryption +* Channel Switch Announcement (CSA) +* Dynamic Frequency Selection & Transmit Power Control (DFS/TPC) +* Beacon Rate +* Min Client Noise Immunity +* Basic Rate Control +* De-Auth RSSI Control +* Burst Beacon Support +* Per SSID Client Rate Limiting +* Promiscuous Mode Support +* **Additional TIP AP NOS Features** + * ISP WAN Profiles ( PPPoE, L2TP, L2oGRE ) + * Embedded Captive Portal (Local Splash non-auth) + * Link Layer Discovery Protocol (LLDP) + * Dynamic Airtime Fairness + * Service Flow QoS + * Wireline & Wireless Tracing (PCAP Cloud Remote Troubleshooting) + * Health Check Reports + * Local Provisioning over SSID (when Cloud or WAN down) + * Multimedia Heuristics (Detection of Unified Communication Sessions) + * SSID Rate Limiting + * GPS Reporting + * Autonomous RRM Client Steering + * Client / AP / Network Metric Telemetry + +**Cloud SDK additional features** + +* **Provisioning** + * Device Identity (Model, MAC, Serial Number) + * Device Software Upgrade + * Multiple SSID Configuration + * Bandwidth Rate Control per SSID + * Multi-Radio 2.4/5/6GHz control + * AP Network Mode Control (Bridge/NAT mode) + * Security (WPA-Personal/WPA & WPA2/3 Personal Mixed/WPA & WPA2/3 Enterprise Mixed/WPA2/3 Personal/WPA2/3 Enterprise/WEP) + * VLAN per SSID + * VxLAN port configuration + * NTP Enable/Disable + * RTLS (Location Services) Enable/Disable +* **RF Control** + * IEEE802.11r Fast BSS Transition per Radio Control + * IEEE802.11k RRM Radio Information per Radio Control + * IEEE802.11v Network Assisted Roaming per Radio Control + * RRM Location AP Channel (uChannel) Provisioning + * RRM Location Client Steering (uSteer) Threshold Provisioning +* **Remote Troubleshooting and Service Assurance** + * Syslog + * Health Check Reports + * Remote DHCP, RADIUS, UE Network Analysis + * Remote TTY Shell + * Remote Packet Capture Analysis + +### **How to contribute** + +If you or your company are interested in contributing to TIP Open Wi-Fi, please join the Wi-Fi Product Group by visiting [Telecom Infra Project](https://telecominfraproject.com/apply-for-membership/) to become a member. diff --git a/SUMMARY.md b/SUMMARY.md new file mode 100644 index 0000000..0baf0d1 --- /dev/null +++ b/SUMMARY.md @@ -0,0 +1,118 @@ +# Table of contents + +* [OpenWiFi Release 2.7 - In Progress](README.md) + +## ABOUT + +* [About OpenWiFi](about/about-openwifi.md) +* [Supported Hardware](about/supported-hardware.md) +* [Device Partner Information](about/device-partner-information.md) +* [Cloud Partner Information](about/cloud-partner-information.md) +* [Ordering OpenWiFi APs](about/ordering-open-wi-fi-aps.md) +* [Example Partner Integrations](about/integrations.md) + +## OPENWIFI STACK + +* [Overview](openwifi-stack/openwifi-stack.md) +* [SDK](openwifi-stack/about-the-sdk.md) +* [Cloud Discovery](openwifi-stack/cloud-discovery/README.md) + * [Discovery without Cloud](openwifi-stack/cloud-discovery/discovery-without-cloud.md) +* [Access Points](openwifi-stack/access-points/README.md) + * [Local Device Settings](openwifi-stack/access-points/local-device-settings.md) +* [Code Repositories](openwifi-stack/repositories.md) +* [Artifacts](openwifi-stack/artifacts.md) + +## SDK + +* [Getting Started](sdk/getting-started.md) +* [Release 2.6 SDK](sdk/sdk.md) +* [Provisioning for Integrators](sdk/provisioning/README.md) + * [Data Model Introduction](sdk/provisioning/data-model-introduction.md) + * [Creating a Configuration](sdk/provisioning/creating-a-configuration.md) +* [User Interface for Admins](sdk/user-interface/README.md) + * [Provisioning](sdk/user-interface/device-provisioning/README.md) + * [Creating Entities](sdk/user-interface/device-provisioning/creating-entities/README.md) + * [Configurations](sdk/user-interface/device-provisioning/creating-entities/configurations/README.md) + * [Metrics Settings Example](sdk/user-interface/device-provisioning/creating-entities/configurations/metrics-settings-example.md) + * [Creating Venues](sdk/user-interface/device-provisioning/creating-venues/README.md) + * [Configurations](sdk/user-interface/device-provisioning/creating-venues/configurations/README.md) + * [WAN](sdk/user-interface/device-provisioning/creating-venues/configurations/wan.md) + * [VAP - SSID](sdk/user-interface/device-provisioning/creating-venues/configurations/vap-ssid.md) + * [Inventory Association](sdk/user-interface/inventory-association.md) + * [Gateway](sdk/user-interface/gateway.md) + * [Devices](sdk/user-interface/devices-view/README.md) + * [Commands](sdk/user-interface/devices-view/commands.md) + * [Statistics](sdk/user-interface/devices-view/statistics.md) + * [Command History](sdk/user-interface/devices-view/command-history.md) + * [Firmware](sdk/user-interface/firmware.md) +* [Monitoring](sdk/monitoring/README.md) + * [ELK Integration](sdk/monitoring/elk-integration.md) + +## SDK Installation + +* [Overview](sdk-installation/overview.md) +* [Deploy using Docker Compose](sdk-installation/deploy-using-docker-compose.md) +* [Deploy using Helm](sdk-installation/deploy-using-helm.md) + +## Device Feature Configuration Examples + +* [Basic Device Provisioning](device-feature-configuration-examples/basic-device-provisioning/README.md) + * [Bridge Mode SSID](device-feature-configuration-examples/basic-device-provisioning/bridge-mode-ssid.md) + * [NAT Gateway Mode SSID](device-feature-configuration-examples/basic-device-provisioning/nat-gateway-mode-ssid.md) + * [Multi-VLAN SSID](device-feature-configuration-examples/basic-device-provisioning/multi-vlan-ssid.md) +* [Advanced Device Feature Configuration Examples](device-feature-configuration-examples/device-feature-configuration-examples/README.md) + * [Zero Touch Provisioning](device-feature-configuration-examples/device-feature-configuration-examples/zero-touch-provisioning.md) + * [DHCP Relay](device-feature-configuration-examples/device-feature-configuration-examples/dhcp-relay.md) + * [Services](device-feature-configuration-examples/device-feature-configuration-examples/services.md) + * [Metrics](device-feature-configuration-examples/device-feature-configuration-examples/metrics.md) + * [GRE](device-feature-configuration-examples/device-feature-configuration-examples/gre.md) + * [L2TP](device-feature-configuration-examples/device-feature-configuration-examples/l2tp.md) + * [VxLAN](device-feature-configuration-examples/device-feature-configuration-examples/vxlan.md) + * [WDS](device-feature-configuration-examples/device-feature-configuration-examples/wds-topologies.md) + * [Mesh](device-feature-configuration-examples/device-feature-configuration-examples/mesh.md) + * [QoS](device-feature-configuration-examples/device-feature-configuration-examples/qos.md) + * [Dynamic Air Time Fairness](device-feature-configuration-examples/device-feature-configuration-examples/dynamic-air-time-fairness.md) + * [Captive Portal](device-feature-configuration-examples/device-feature-configuration-examples/captive-portal/README.md) + * [External Captive Portal](device-feature-configuration-examples/device-feature-configuration-examples/captive-portal/external-captive-portal.md) + * [Roaming RRM and SON](device-feature-configuration-examples/device-feature-configuration-examples/roaming-rrm-and-son.md) + * [RADIUS Authenticated SSID](device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/README.md) + * [Dynamic VLANs with RADIUS](device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/dynamic-vlans-with-radius.md) + * [WISPr Subscriber Bandwidth](device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/wispr-subscriber-bandwidth.md) + * [Dynamic Multi PSK](device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/dynamic-multi-psk.md) + * [RADIUS MAC-Auth](device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/radius-mac-auth.md) + * [Multi-PSK (MDU Shared Key)](device-feature-configuration-examples/device-feature-configuration-examples/multi-psk-mdu-multiple-shared-key.md) + * [Wireguard](device-feature-configuration-examples/device-feature-configuration-examples/wireguard.md) + * [Dynamic Air-Time Policy](device-feature-configuration-examples/device-feature-configuration-examples/dynamic-air-time-policy.md) + * [Passpoint®](device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/README.md) + * [Configuration Introduction](device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/configuration-introduction.md) + * [Advertising Services](device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/advertising-services.md) + * [Passpoint® Configuration](device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/passpoint-r-configuration.md) + +## RELEASE + +* [What's New](release/whats-new.md) +* [Features](release/features.md) +* [Security Updates](release/security.md) +* [Resolved Issues](release/resolved-issues.md) +* [Outstanding Items](release/outstanding-items.md) +* [Testing Results](release/testing-results.md) + +## DEVELOPER RESOURCES + +* [SDK API](developer-resources/api/README.md) + * [OpenAPI Definitions](developer-resources/api/openapi-definitions.md) + * [Security Service](developer-resources/api/security-service.md) + * [Gateway Service](developer-resources/api/gateway-service.md) + * [Firmware Management Service](developer-resources/api/firmware-management-service.md) + * [Provisioning Service](developer-resources/api/provisioning-service.md) + * [Analytics Service](developer-resources/api/analytics-service.md) + * [Postman Collection](developer-resources/api/postman-collection.md) +* [SDK KAFKA](developer-resources/sdk-kafka/README.md) + * [Connection](developer-resources/sdk-kafka/connection.md) + * [Device Event Queue](developer-resources/sdk-kafka/device-event-queue.md) + * [Device Telemetry](developer-resources/sdk-kafka/device-telemetry.md) + * [Healthcheck](developer-resources/sdk-kafka/healthcheck.md) + * [Provisioning Change](developer-resources/sdk-kafka/provisioning-change.md) + * [Service Events](developer-resources/sdk-kafka/service-events.md) + * [State](developer-resources/sdk-kafka/state.md) + * [WiFi Scan](developer-resources/sdk-kafka/wifi-scan.md) diff --git a/about/about-openwifi.md b/about/about-openwifi.md new file mode 100644 index 0000000..041cd5c --- /dev/null +++ b/about/about-openwifi.md @@ -0,0 +1,40 @@ +# About OpenWiFi + +Established in Q42019, the TIP OpenWiFi solution goal has been to break vendor lock-in through disaggregation architectures, open APIs—with common embedded software and management that is both community- and commercially-supported. + +Available for use as a completely Open Source reference, ODM vendors can easily adopt TIP OpenWiFi platforms as either a complimentary addition to hardware offers or as an entirely TIP OpenWiFi based hardware offer. + +Vendors and operators can use the community project as a complete solution, extend the software stack based on design goals, or use only the components desired for deployment. The OpenWiFi community includes hardware ODM vendors, software DevOps, OEM, and System Integrators. + +For more information on Telecom Infra Project and the Open Converged Wireless - OpenWiFi initiative please visit: [https://telecominfraproject.com/openwifi/](https://telecominfraproject.com/openwifi/) + +![](../.gitbook/assets/image1.jpeg) + +TIP OpenWiFi is a community-developed, disaggregated Wi-Fi software system, offered as free open-source software that includes a cloud SDK and an enterprise-grade Access Point (AP) firmware, designed and validated to work seamlessly together. + +![](../.gitbook/assets/image2.png) + +## Contribute to the project + +Membership to the TIP OpenWiFi project is free with the request to contribute as code, test, documentation or deployment. Participation and focus is governed by the PG Charter, Antitrust Guidelines and IPR Policies. + +* [Telecom Infra Project Bylaws](https://cdn.brandfolder.io/D8DI15S7/as/q7rnyo-fv487k-d2tvpc/Bylaws) +* [Telecom Infra Project Organizational documents](https://telecominfraproject.com/organizational-documents/) +* [TIP Document IPR Policy](https://cdn.brandfolder.io/D8DI15S7/as/q7rnyo-fv487k-7qoext/Document\_IPR\_Policy\_-\_Telecom\_Infra\_Project.pdf) + +Meta Connectivity, is a PG champion of TIP OpenWiFi. All source code in the program is subject to BSD-3 license and in the public domain. No internal Meta tooling or IP is involved in the project. + +## Membership has its privilege + +To contribute to the project, you must become a member of TIP and the OCW PG. + +After you become a member, you can access the following resources: + +* OpenWiFi project WiKi in Confluence +* Development information in JIRA +* Team collaboration and communication via TIP Slack +* Team meetings + +The TIP OpenWiFi group holds regular meetings with Meta Connectivity Development team members with stand up calls every Monday. PG member meetings are monthly on first Monday. + +For meeting schedules and additional information, see the [OpenWiFi Project Confluence](https://telecominfraproject.atlassian.net/wiki/spaces/WIFI/overview%3E) wiki. diff --git a/about/cloud-partner-information.md b/about/cloud-partner-information.md new file mode 100644 index 0000000..ed5e84e --- /dev/null +++ b/about/cloud-partner-information.md @@ -0,0 +1,45 @@ +--- +description: TIP OpenWiFi +--- + +# Cloud Partner Information + +The OpenWiFi SDK is designed to enable Cloud Partners to consume basic southbound device management and device discovery. This is similar to augmenting a southbound device adapter for many orchestration or automation systems. + +## OpenWiFi Microservices + +The OpenWiFi SDK also offers microservices for Cloud Partners including the following: + +* Firmware Management +* Device Provisioning +* Subscriber Portal +* Analytics +* User Interface + +This independent microservice approach has numerous advantages including ease of integration, ability to leverage more of the stack to accelerate product availability or support only device communication and discovery for partners who seek to maintain more functionality within their own application. + +### Step 1 : Join + +If your organization is not already a TIP Open Converged Wireless Project Group (OCW PG) member, consider signing up. Joining the OCW PG is free as a Software Participation Tier in TIP. + +For more information please visit:[ Becoming a Member](https://telecominfraproject.com/apply-for-membership/) + +### Step 2 : Slack, Keys & Atlassian Tools + +Introduce your organization to the Community on Slack. All Community members have access to Telecom Infra Project Slack. Send a message to the **#general** and **#open-wifi-ucentral** Slack channels. + +Send an email to licensekeys@telecominfraproject.com to request onboarding as a supplier for OpenWiFi Cloud. All OpenWiFi Gateway services in the SDK require a signed key to terminate incoming device connections in the southbound interface. + +Ensure your GitHub account is linked in your Telecom Infra Project user profile. Linking your GitHub account to your TIP user account enables write access to OpenWiFi repositories. Also confirm that the Atlassian link is also present in your user profile. + +### Step 3 : Integration + +The OpenWiFi SDK uses OpenAPI 3.0 compliant northbound Rest API and Kafka for message bus topics. Typical CRUD actions occur via the Rest API. Kafka presents topics for device discovery and all telemetry captured from the network edge. + +Please consult the [API topics](../developer-resources/api/) to begin with integration work. + +### Summary + +Integrations that use the published interfaces are the easiest approach to starting with OpenWiFi SDK. + +As a Cloud Partner who intends to contribute a new SDK microservice, please announce the idea on the **#general** and **#open-wifi-ucentral** Slack channels for the Community to provide feedback. There is a skeleton microservice example to help you build new services that inherit the SDK service discovery and security design. For more information about building a service, see the API section in the [Developer Resources](../developer-resources/api/) section. An example used for building a service is located in [GitHub](https://github.com/Telecominfraproject/wlan-cloud-tools). diff --git a/about/device-partner-information.md b/about/device-partner-information.md new file mode 100644 index 0000000..91d0975 --- /dev/null +++ b/about/device-partner-information.md @@ -0,0 +1,41 @@ +--- +description: TIP OpenWiFi +--- + +# Device Partner Information + +TIP OpenWiFi enables a turnkey-from-factory experience for the managed Wi-Fi ecosystem. + +As a TIP member, an ODM or OEM can offer a TIP SKU direct from the factory. This opportunity has numerous advantages including scale of supply, ease of distribution, partner branding, and use of standard software including device certificates direct from your factory. + +### Step 1 : Join + +If your organization is not already a TIP Open Converged Wireless Project Group (OCW PG) member, consider signing up. Joining the OCW PG is free as a Software Participation Tier in TIP. + +For more information please visit:[ Becoming a Member](https://telecominfraproject.com/apply-for-membership/) + +### Step 2 : Slack, Keys & Atlassian Tools + +Introduce your organization to the Community on Slack. All Community members have access to Telecom Infra Project Slack. Send a message to "general" and "open-wifi-ucentral" channels. + +Send an email to licensekeys@telecominfraproject.com to request onboarding as a supplier for OpenWiFi SKU devices. + +Ensure your GitHub account was linked in your Telecom Infra Project user profile, this will enable write access to OpenWiFi repositories. Also confirm Atlassian link is also present in user profile. + +### Step 3 : Build your device profile + +Devices follow standard Linux patch process for enhancements and bug fixes. A development branch should be defined, perform work necessary to add support for the new device including a new profile for the build system. + +Test your work locally, when confident push and submit a pull request for the next branch. + +Follow the guidance posted: [Source Code & Repositories](https://telecominfraproject.atlassian.net/wiki/spaces/WIFI/pages/355598358/Source+Code+Repositories) + +### Step 4 : Submit Device for Community Lab Testing + +To obtain access to TIP OpenWiFi support and regression, devices must be sent to the Community Test Lab for QA sanity automation. A formal process for obtaining a TIP OpenWiFi Logo mark will be launched in 2022. + +### Summary + +If the pull request review is successful the new device will be merged. + +When an ODM or OEM device vendor has been onboarded with license keys, the device will be included in nightly builds. diff --git a/about/integrations.md b/about/integrations.md new file mode 100644 index 0000000..fa9c68c --- /dev/null +++ b/about/integrations.md @@ -0,0 +1,69 @@ +# Example Partner Integrations + +You can extend deployment opportunities using third-party integrations with the TIP OpenWiFi SDK. For example, with third-party integrations, you can create a controller of multiple services. The services can include device provisioning, firmware management, network management, service assurance, subscriber authentication, captive portal services, IoT and amenity networks all commonly deployed across the MDU market. All of these traditional functions are supported in part by the OpenWiFi [API ](../developer-resources/api/)and [Telemetry](../developer-resources/sdk-kafka/) data from the OpenWiFi SDK. + +## Integration by Vertical + +### Service Provider Access + +The simplest SDK integration is to integrate operator OSS/BSS systems for device provisioning, firmware management, and telemetry reporting. + +In this scenario, the operator back office systems including and not limited to assurance and monitoring, inventory management and billing systems, will integrate with the OpenWiFi API and message bus interfaces of the SDK. + +![](../.gitbook/assets/image20.png) + +In service provider access, commonly non-fixed subscribers are served using the same technologies present in WLAN Controllers however the network may be provisioned to direct such traffic to stand alone appliances or applications including authentication (AAA) and walled garden / captive portal systems. TIP OpenWiFi systems support such variations. + +TIP OpenWiFi is a local-breakout based approach therefore user traffic is not multiplexed through the SDK, the native local network provides access for the provisioned and billed use. For operators who do wish to aggregate subscriber traffic to a Wireless Access Gateway (WAG) the AP NOS has multiple network encapsulation options to choose from. + +### WLAN Controller + +WLAN controllers typically expose network visibility, subscriber management including authentication, roaming and RRM control, visualization of per Wi-Fi client performance including client session information, client session throughput, client session quality. Most controllers will implement some SON functionality where managing RF resources and channel planning are provided centrally at the controller and pushed across the managed WLAN. + +![](../.gitbook/assets/image21.png) + +While TIP OpenWiFi is a local breakout enabled solution, vendors who wish to aggregate all subscriber traffic through the WLAN Controller should provision the use of one of the AP NOS supported network encapsulations. + +### Network Access Controller + +Another model that is found in venue, enterprise and some service providers is a Network Access Controller (NAC). The NAC often appears as a decoupled controller where service assurance is less visible such as SON or RRM with focus instead on security, captive access, authentication of nomadic and or BYoD (Bring Your own Device) control. + +In scenarios where the deployment is a venue, hotspot or service provider, the NAC will also offer a payment gateway enabling the solution to monetize network access. Common to the NAC solution is the ability to manage various headless devices, IoT elements, and provide DPI (Deep Packet Inspection ) capabilities based on knowledge of the Wi-Fi client, device type, how it authenticated and from where in the network it currently resides. These systems may be inline or more preferably out-of-band based and in the latter is where integration to the SDK is intended for synchronizing provisioned Wi-Fi devices via the SDK with authentication and security offerings of the NAC platform. + +![](../.gitbook/assets/image22.png) + +Device provisioning occurs through the SDK, which in turn includes provisioning of Virtual Access Point (VAP) to direct authentication to the NAC. Subscriber device authentication traffic arrives at the NAC which manages this according to the operator defined policies. In the case of a captive portal, NAC systems typically include portal redirection that may be WISPr based, or Coova based and some may include Passpoint support. + +## Integration by Partner + +TIP OpenWiFi has a diverse and rich ecosystem of members who solve a number of operator deployment and subscriber service challenges. In each of these cases and for any integrator, all the types of SDK integration are possible via APIs and message bus paths. + +### JoinDigital + +JoinDigital is an MDU Managed Service Provider. Within the JoinDigital portfolio are Small Medium Business (SMB) customers served as part of an MSP for the entire building. JoinDigital offers all the services a building requires including security, amenity networks, IoT integration, subscriber / tennant vlan management, hotspot services for common areas and more. + +JoinDigital is an example of an MDU managed service provider who leverages their own OSS/BSS systems much the way a service provider would provide broadband provisioning of subscriber services. As such, JoinDigital integrated their existing billing, network management, assurance and inventory with the SDK directly. + +### Indio Networks + +Indio offers a diverse range of wireless network solutions for service provider and venue operator markets. They serve markets worldwide for Wi-Fi management, hotspot and IoT solutions. + +Indio WiOS cloud platform was integrated with the SDK to bring device provisioning, firmware management and telemetry into the WiOS cloud management platform. This enabled Indio to simultaneously offer support for their own hardware devices running OpenWiFi in addition to the full range of platforms available via all the ODM partners, all possible from the WiOS interface. In this model Indio appears to OpenWiFi as a disaggregated WLAN Controller when integrated to the SDK offering a variety of wireless features. + +### EdgeCore + +EdgeCore provides a WLAN Controller that is more closely aligned to the enterprise or venue market. There are features such as hotspot enablement, and built-in subscriber authentication with strong focus on Wi-Fi quality both in AP device and subscriber client device. Dashboards offer strong service and network management capabilities with integration to the SDK at the device provisioning, firmware management and telemetry level. + +### Lindsay Broadband + +Lindsay Broadband is a direct supplier to the Cable MSO industry. A strong focus on outdoor wireless and wireline products, Lindsay has been enabling Wi-Fi in particular from the Cable MSO aerial strand for years. As the Cable MSO exhibits the service provider model of OSS/BSS integration to device provisioning, it has been simple for Lindsay to define a solution using just the SDK with support from the ecosystem. + +The cable strand device has been hardware engineered to include a TIP OpenWiFi industrial based board offering Wi-Fi services for venues and mobile offload use cases. + +Lindsay is currently manufacturing several dozen strand based devices for their customer trials of OpenWiFi. + +![](../.gitbook/assets/image20.png) + +For the Cable MSO deployment, the MSO OSS/BSS system is involved from the standpoint of network management and device provisioning integration to the SDK. The MSO may complement the subscriber management and services offered by adding NAC style out of band captive portal systems integrated via the SDK in addition to enabling OpenRoaming and Passpoint services for mobile offload and secure client access. + +### diff --git a/about/ordering-open-wi-fi-aps.md b/about/ordering-open-wi-fi-aps.md new file mode 100644 index 0000000..354e8f0 --- /dev/null +++ b/about/ordering-open-wi-fi-aps.md @@ -0,0 +1,11 @@ +--- +description: TIP OpenWiFi Member Access Point Ordering Information +--- + +# Ordering OpenWiFi APs + +To order OpenWiFi APs, be sure you're a TIP OpenWiFi member and then contact ODM manufacturers who participate in the TIP OpenWiFi eco-system. AP vendor contact information is listed on the [OpenWiFi AP Hardware](https://telecominfraproject.atlassian.net/wiki/spaces/WIFI/pages/112689187/AP+Hardware) pages. + +If your organization is not already a TIP Open Converged Wireless Project Group (OCW PG) member, consider signing up. Joining the OCW PG is free as a Software Participation Tier in TIP. + +For more information please visit:[Becoming a Member](https://telecominfraproject.com/apply-for-membership/) diff --git a/about/supported-hardware.md b/about/supported-hardware.md new file mode 100644 index 0000000..9ac6036 --- /dev/null +++ b/about/supported-hardware.md @@ -0,0 +1,15 @@ +# Supported Hardware + +TIP OpenWiFi supports Wi-Fi 5 (802.11ac), Wi-Fi 6 (802.11ax) and Wi-Fi 6E (6GHz 802.11ax) in a mix of indoor and outdoor, ceiling to wall, desk, pole and strand environments. + +For TIP OpenWiFi, a mix of ODMs deliver a diverse portfolio including CIG, Actiontech, EdgeCore, Cybertan, Arcadyan, Wallys, Lindsay, HFCL and Inventum. + +![](../.gitbook/assets/image8.png) + +## Currently supported hardware + +The list of supported hardware continues to grow. TIP members can access the Confluence site that lists all currently supported hardware. + +[Supported OpenWiFI AP Hardware](https://telecominfraproject.atlassian.net/wiki/spaces/WIFI/pages/112689187/OpenWiFi+AP+Hardware) + +To access the list of supported hardware and other important information on the member's Confluence site, [become a TIP member](https://telecominfraproject.com/apply-for-membership/). diff --git a/developer-resources/api/README.md b/developer-resources/api/README.md new file mode 100644 index 0000000..91f3bd9 --- /dev/null +++ b/developer-resources/api/README.md @@ -0,0 +1,58 @@ +--- +description: OpenWiFi 2.0 SDK +--- + +# SDK API + +OpenWiFi services follow the OpenAPI 3.0 definition. The complete API is described here: [OpenWiFi SDK OpenAPI](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/openapi/owgw.yaml) + +## Devices + +OpenWiFi devices are Access Points or Switches (and other forms in the future), that support the uCentral configuration schema. Devices contact a controller using the uCentral protocol. + +## Communication + +The communication between the controller and the devices use the uCentral protocol. This protocol is defined in this [document](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/PROTOCOL.md). + +## Device Configuration + +A device is configured by ingesting a uCentral configuration. That configuration will be provided by the SDK Gateway as a result of a command through the API. Command processing occurs when the device's configuration is older than what is known in the SDK Gateway. The uCentral schema is a JSON document containing parameters to set on a particular device. + +## SDK Gateway Communication + +In order to speak to the Gateway, you must implement a client that uses the OpenAPI definition for the gateway. You can find its [definition here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/openapi/ucentral/ucentral.yaml). You cannot talk to a device directly. + +## API Basics + +### Device `serialNumber` + +Throughout the API, the `serialNumber` of the device is used as the key. The `serialNumber` is actual the MAC address of the device, without its `:`. The `serialNumber` is guaranteed to be unique worldwide. The device uses its serial number to identify itself to the controller. + +### Device Configuration + +The configuration can be supplied when the device is created. After the device is created, the only way to modify the configuration is by using the `/device/{serialNumber}/configure` endpoint. The Gateway maintains the versioning of the configuration through the use of a `uuid`. The Gateway maintains that number and will ignore anything your supply. The controller also does minimum validation on the configuration: it must be a valid JSON document and must have a `uuid` field which will be ignored. + +### Device Capabilities + +Device capabilities are uploaded to the Gateway when the device performs its initial connection. Capabilities tell the Gateway what the device is able to support. The Gateway uses this information to provide a configuration matched to the device type. + +### Command Queue + +The Gateway will send commands to the devices. These commands are kept in a table and are sent at the appropriate time or immediately when the device connects. For example, you could ask a device to change its configuration, however it might be unreachable. Upon next device connection, this configure command will be sent. The list of commands is retrieved using the `/commands` endpoint. + +### Commands + +Several commands maybe sent to a device: reboot, configure, factory reset, firmware upgrade, LEDs, trace, message request, etc. The API endpoint `/device/{serialNumber}/{command}` details all the available commands. + +### Device Specific Collections + +For each device, a number of collections are collected and kept in the database. Here's a brief list: + +* `logs`: device specific logs are kept. A device amy also send something it wants added into its own logs. `crashlogs` are a special type of logs created after a device has had a hard crash. +* `statistics`: statistics about the device. This is current la JSON document and will be documented at a later date. +* `healthchecks`: periodically, a device will run a self-test and report its results. These includes anything that maybe going wrong with the current device configuration. A `sanity` level is associated to the degree of health of the device. 100 meaning a properly operating device. +* `status`: tells you where the device is and how much data is used for protocol communication. + +## The API is for an operator + +This API is meant for an operator who would have to help a subscriber in configuring devices, reboot, manage firmware, etc. diff --git a/developer-resources/api/analytics-service.md b/developer-resources/api/analytics-service.md new file mode 100644 index 0000000..75442ec --- /dev/null +++ b/developer-resources/api/analytics-service.md @@ -0,0 +1,57 @@ +# Analytics Service + +{% swagger src="../../.gitbook/assets/owanalytics.yaml" path="undefined" method="undefined" %} +[owanalytics.yaml](../../.gitbook/assets/owanalytics.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owanalytics.yaml" path="/board/{id}" method="get" %} +[owanalytics.yaml](../../.gitbook/assets/owanalytics.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owanalytics.yaml" path="/board/{id}" method="post" %} +[owanalytics.yaml](../../.gitbook/assets/owanalytics.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owanalytics.yaml" path="/board/{id}" method="delete" %} +[owanalytics.yaml](../../.gitbook/assets/owanalytics.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owanalytics.yaml" path="/board/{id}" method="put" %} +[owanalytics.yaml](../../.gitbook/assets/owanalytics.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owanalytics.yaml" path="/board/{id}/devices" method="get" %} +[owanalytics.yaml](../../.gitbook/assets/owanalytics.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owanalytics.yaml" path="/board/{id}/timepoints" method="get" %} +[owanalytics.yaml](../../.gitbook/assets/owanalytics.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owanalytics.yaml" path="/board/{id}/timepoints" method="delete" %} +[owanalytics.yaml](../../.gitbook/assets/owanalytics.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owanalytics.yaml" path="/iptocountry" method="get" %} +[owanalytics.yaml](../../.gitbook/assets/owanalytics.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owanalytics.yaml" path="/wifiClientHistory" method="get" %} +[owanalytics.yaml](../../.gitbook/assets/owanalytics.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owanalytics.yaml" path="/wifiClientHistory/{client}" method="get" %} +[owanalytics.yaml](../../.gitbook/assets/owanalytics.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owanalytics.yaml" path="/wifiClientHistory/{client}" method="delete" %} +[owanalytics.yaml](../../.gitbook/assets/owanalytics.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owanalytics.yaml" path="/system" method="get" %} +[owanalytics.yaml](../../.gitbook/assets/owanalytics.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owanalytics.yaml" path="/system" method="post" %} +[owanalytics.yaml](../../.gitbook/assets/owanalytics.yaml) +{% endswagger %} diff --git a/developer-resources/api/firmware-management-service.md b/developer-resources/api/firmware-management-service.md new file mode 100644 index 0000000..d88c3b8 --- /dev/null +++ b/developer-resources/api/firmware-management-service.md @@ -0,0 +1,53 @@ +# Firmware Management Service + +{% swagger src="../../.gitbook/assets/owfms.yaml" path="/firmwares" method="get" %} +[owfms.yaml](../../.gitbook/assets/owfms.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owfms.yaml" path="/firmware/{id}" method="get" %} +[owfms.yaml](../../.gitbook/assets/owfms.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owfms.yaml" path="/firmware/{id}" method="post" %} +[owfms.yaml](../../.gitbook/assets/owfms.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owfms.yaml" path="/firmware/{id}" method="put" %} +[owfms.yaml](../../.gitbook/assets/owfms.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owfms.yaml" path="/firmware/{id}" method="delete" %} +[owfms.yaml](../../.gitbook/assets/owfms.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owfms.yaml" path="/revisionHistory/{serialNumber}" method="get" %} +[owfms.yaml](../../.gitbook/assets/owfms.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owfms.yaml" path="/revisionHistory/{serialNumber}" method="delete" %} +[owfms.yaml](../../.gitbook/assets/owfms.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owfms.yaml" path="/firmwareAge" method="get" %} +[owfms.yaml](../../.gitbook/assets/owfms.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owfms.yaml" path="/connectedDevices" method="get" %} +[owfms.yaml](../../.gitbook/assets/owfms.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owfms.yaml" path="/connectedDevice/{serialNumber}" method="get" %} +[owfms.yaml](../../.gitbook/assets/owfms.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owfms.yaml" path="/deviceReport" method="get" %} +[owfms.yaml](../../.gitbook/assets/owfms.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owfms.yaml" path="/system" method="get" %} +[owfms.yaml](../../.gitbook/assets/owfms.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owfms.yaml" path="/system" method="post" %} +[owfms.yaml](../../.gitbook/assets/owfms.yaml) +{% endswagger %} diff --git a/developer-resources/api/gateway-service.md b/developer-resources/api/gateway-service.md new file mode 100644 index 0000000..d37337b --- /dev/null +++ b/developer-resources/api/gateway-service.md @@ -0,0 +1,189 @@ +# Gateway Service + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/devices" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/commands" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/commands" method="delete" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/command/{commandUUID}" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/command/{commandUUID}" method="delete" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/default_configurations" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/default_configuration/{name}" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/default_configuration/{name}" method="post" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/default_configuration/{name}" method="put" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/default_configuration/{name}" method="delete" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}" method="post" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}" method="put" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}" method="delete" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/logs" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/logs" method="delete" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/healthchecks" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/healthchecks" method="delete" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/capabilities" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/capabilities" method="delete" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/statistics" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/statistics" method="delete" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/status" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/command" method="post" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/configure" method="post" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/upgrade" method="post" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/reboot" method="post" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/factory" method="post" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/leds" method="post" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/trace" method="post" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/wifiscan" method="post" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/request" method="post" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/eventqueue" method="post" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/telemetry" method="post" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/ouis" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/device/{serialNumber}/rtty" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/file/{uuid}" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/file/{uuid}" method="delete" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/blacklist" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/blacklist/{serialNumber}" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/blacklist/{serialNumber}" method="post" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/blacklist/{serialNumber}" method="put" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/blacklist/{serialNumber}" method="delete" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/capabilities" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/deviceDashboard" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/system" method="get" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owgw.yaml" path="/system" method="post" %} +[owgw.yaml](../../.gitbook/assets/owgw.yaml) +{% endswagger %} diff --git a/developer-resources/api/openapi-definitions.md b/developer-resources/api/openapi-definitions.md new file mode 100644 index 0000000..18054c7 --- /dev/null +++ b/developer-resources/api/openapi-definitions.md @@ -0,0 +1,59 @@ +--- +description: OpenWiFi 2.0 SDK +--- + +# OpenAPI Definitions + +## Where is the OpenAPI? + +This uses OpenAPI definition 3.0 and can be found [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/openapi/ucentral/owgw.yaml). All endpoints begin with `/api/v1`. + +## API Flow + +API endpoints are secured with bearer-token authentication using end-point `/oauth2`. Once you obtain `access-token`, you will need to pass it in the headers under `Authorization: Bearer `. + +## Basic Entities + +The API revolves around `devices`, `commands`, and `default_configurations`. To retrieve a list of `devices` to know what is available and then use the endpoint `device` to access all device specific information. To retrieve `commands` and `default_configurations` follow those endpoints. Most operations rely on the `serialNumber` of a device. That `serialNumber` is unique and generated on the device. Serial Number matches the device's MAC address. + +* `devices`: The list of all devices in the system. This maybe very large, pagination is recommended. +* `commands`: The list of commands issued by the system. This list could also be large. +* `default_configurations`: A list of default configurations used to supply existing devices. + +## Relationships + +A device is a physical (or potentially logical) entity using the ucentral protocol. Currently, APs and Switches are the only devices used. A device has several attributes. Additionally, other collections are supported for each device: + +* `logs`: Specific for a device. Logs originate from the device or associated with the device by some mechanism. +* `healthchecks`: Reports from the device coming periodically after device self tests. +* `statistics`: Periodically produced by the devices and document actual state data from each device. +* `capabilities`: This details the actual data model supported by the device. + +The `device` entry point is also used to query about the `status` of the device and used to inject certain commands for a specific device. Commands supported for each device: + +* `reboot`: This will force the device to reboot. +* `configure`: Configure sends a new configuration to a device. +* `factory`: Forces the device to perform a factory-reset. +* `upgrade`: Forces the device to do a firmware upgrade. +* `leds`: Ask the device to flash its LEDs or turn them on or off. +* `trace`: Performs a remove LAN trace. Once the trace is completed, the produced file may be removed using the `file` endpoint. +* `command`: Performs a proprietary command. The meaning depends on the device. +* `request`: Request an immediate message of type `state` or `healthcheck`. + +The `file` end point is used to retrieve and remove files produced by the Gateway. Currently this is limited to the results of a `trace` command. The file name will always match the `uuid` of the command that produced it. If several files are needed, the files will be named `uuid`, `uuid.1`, `uuid.2`, etc. + +## Dates + +All dates should use the format defined in [RFC3339](https://tools.ietf.org/html/rfc3339). All times are UTC based. Here is an example: + +``` +1985-04-12T23:20:50.52Z +``` + +## Command `when` parameter + +Most commands use a `when` parameter to suggest to the device when to perform the command. This is a _suggestion_ only. The device may decide to perform the command when it is optimal for itself. It maybe busy doing something and decline to do a reboot for several minutes for example. The device may reply with the actual `when` it will perform the command. + +## Configuration UUID + +The gateway manages the configuration UUID. So if you set a UUID for a configuration, it will be ignored. The gateway uses UUID as versioning. The UUID is unique within a single device. The resulting UUID or a configuration change is returned as part of the `configure` command. diff --git a/developer-resources/api/postman-collection.md b/developer-resources/api/postman-collection.md new file mode 100644 index 0000000..2ce22c6 --- /dev/null +++ b/developer-resources/api/postman-collection.md @@ -0,0 +1,5 @@ +# Postman Collection + +Here is the current postman collection for testing purposes: + +{% file src="../../.gitbook/assets/TIP OpenWiFi 2.x.postman_collection.json" %} diff --git a/developer-resources/api/provisioning-service.md b/developer-resources/api/provisioning-service.md new file mode 100644 index 0000000..5a8d2d4 --- /dev/null +++ b/developer-resources/api/provisioning-service.md @@ -0,0 +1,209 @@ +# Provisioning Service + +{% swagger src="../../.gitbook/assets/owprov.yaml" path="/entity/{uuid}" method="get" %} +[owprov.yaml](../../.gitbook/assets/owprov.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/entity/{uuid}" method="post" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/entity/{uuid}" method="put" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/entity/{uuid}" method="delete" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/contact" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/contact/{uuid}" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/contact/{uuid}" method="post" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/contact/{uuid}" method="put" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/contact/{uuid}" method="delete" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/location" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/location/{uuid}" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/location/{uuid}" method="post" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/location/{uuid}" method="put" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/location/{uuid}" method="delete" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/inventory" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/inventory/{serialNumber}" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/inventory/{serialNumber}" method="post" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/inventory/{serialNumber}" method="put" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/inventory/{serialNumber}" method="delete" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/venue" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/venue/{uuid}" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/venue/{uuid}" method="post" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/venue/{uuid}" method="put" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/venue/{uuid}" method="delete" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/map" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/map/{uuid}" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/map/{uuid}" method="post" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/map/{uuid}" method="put" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/map/{uuid}" method="delete" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/managementPolicy" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/managementPolicy/{uuid}" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/managementPolicy/{uuid}" method="post" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/managementPolicy/{uuid}" method="put" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/managementPolicy/{uuid}" method="delete" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/managementRole" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/managementRole/{uuid}" method="post" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/managementRole/{uuid}" method="put" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/managementRole/{uuid}" method="delete" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/configurations" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/configurations/{uuid}" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/configurations/{uuid}" method="post" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/configurations/{uuid}" method="put" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/configurations/{uuid}" method="delete" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/iptocountry" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/signup" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/signup" method="post" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/signup" method="put" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/signup" method="delete" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/variables" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/dashboard" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/system" method="get" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owprov (1).yaml" path="/system" method="post" %} +[owprov (1).yaml](<../../.gitbook/assets/owprov (1).yaml>) +{% endswagger %} diff --git a/developer-resources/api/security-service.md b/developer-resources/api/security-service.md new file mode 100644 index 0000000..6fee0db --- /dev/null +++ b/developer-resources/api/security-service.md @@ -0,0 +1,73 @@ +# Security Service + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/oauth2" method="post" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/oauth2/{token}" method="delete" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/systemEndpoints" method="get" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/users" method="get" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/user/{id}" method="get" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/user/{id}" method="post" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/user/{id}" method="put" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/user/{id}" method="delete" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/avatar/{id}" method="get" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/avatar/{id}" method="post" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/avatar/{id}" method="delete" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/email" method="post" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/sms" method="post" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/securityProfiles" method="get" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/systemServices" method="get" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/validateToken" method="get" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/system" method="get" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} + +{% swagger src="../../.gitbook/assets/owsec.yaml" path="/system" method="post" %} +[owsec.yaml](../../.gitbook/assets/owsec.yaml) +{% endswagger %} diff --git a/developer-resources/sdk-kafka/README.md b/developer-resources/sdk-kafka/README.md new file mode 100644 index 0000000..6a880d0 --- /dev/null +++ b/developer-resources/sdk-kafka/README.md @@ -0,0 +1,13 @@ +# SDK KAFKA + +The current release has the following Kafka topics: + +* connection +* device\_event\_queue +* device\_telemetry +* healthcheck +* provisioning\_change +* service\_events +* state +* wifiscan + diff --git a/developer-resources/sdk-kafka/connection.md b/developer-resources/sdk-kafka/connection.md new file mode 100644 index 0000000..4b68fab --- /dev/null +++ b/developer-resources/sdk-kafka/connection.md @@ -0,0 +1,400 @@ +# Connection + +Here are the current messages related to connection topic: + +## Ping Message + +```json +{ + "system": { + "id": 1637414624750592500, + "host": "https://owgw-owgw:17002" + }, + "payload": { + "ping": { + "compatible": "cig_wf194c4", + "connectionIp": "f40b9fe78d3d@10.10.10.48:35510", + "firmware": "OpenWrt 21.02-SNAPSHOT r16399+136-c67509efd7 / TIP-v2.6.0-rc4-eebe021", + "locale": "US", + "serialNumber": "f40b9fe78d3d", + "timestamp": 1656513408 + } + } +} +``` + +## Capability Message + +```json +{ + "system": { + "id": 1637414624750592500, + "host": "https://owgw-owgw:17002" + }, + "payload": { + "capabilities": { + "compatible": "cig_wf196", + "label_macaddr": "82:4f:81:60:11:e4", + "macaddr": { + "lan": "82:4f:81:60:11:e5", + "wan": "82:4f:81:60:11:e4" + }, + "model": "CIG WF196", + "network": { + "lan": [ + "eth1" + ], + "wan": [ + "eth0" + ] + }, + "platform": "ap", + "switch": { + "switch0": { + "enable": false, + "reset": false + } + }, + "wifi": { + "platform/soc/c000000.wifi1": { + "band": [ + "5G" + ], + "channels": [ + 36, + 40, + 44, + 48, + 52, + 56, + 60, + 64, + 100, + 104, + 108, + 112, + 116, + 120, + 124, + 128, + 132, + 136, + 140, + 144, + 149, + 153, + 157, + 161, + 165 + ], + "dfs_channels": [ + 52, + 56, + 60, + 64, + 100, + 104, + 108, + 112, + 116, + 120, + 124, + 128, + 132, + 136, + 140, + 144 + ], + "frequencies": [ + 5180, + 5200, + 5220, + 5240, + 5260, + 5280, + 5300, + 5320, + 5500, + 5520, + 5540, + 5560, + 5580, + 5600, + 5620, + 5640, + 5660, + 5680, + 5700, + 5720, + 5745, + 5765, + 5785, + 5805, + 5825 + ], + "he_mac_capa": [ + 13, + 39448, + 4160 + ], + "he_phy_capa": [ + 24604, + 34892, + 56191, + 40067, + 3073, + 0 + ], + "ht_capa": 6639, + "htmode": [ + "HT20", + "HT40", + "VHT20", + "VHT40", + "VHT80", + "VHT80+80", + "VHT160", + "HE20", + "HE40", + "HE80", + "HE160", + "HE80+80" + ], + "rx_ant": 240, + "tx_ant": 240, + "vht_capa": 1939601914 + }, + "platform/soc/c000000.wifi1+1": { + "band": [ + "2G" + ], + "channels": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "frequencies": [ + 2412, + 2417, + 2422, + 2427, + 2432, + 2437, + 2442, + 2447, + 2452, + 2457, + 2462 + ], + "he_mac_capa": [ + 13, + 39448, + 4160 + ], + "he_phy_capa": [ + 24578, + 34892, + 50047, + 40067, + 3073, + 0 + ], + "ht_capa": 6639, + "htmode": [ + "HT20", + "HT40", + "VHT20", + "VHT40", + "VHT80", + "HE20", + "HE40" + ], + "rx_ant": 15, + "tx_ant": 15, + "vht_capa": 1939569042 + }, + "soc/20000000.pci/pci0000:00/0000:00:00.0/0000:01:00.0": { + "band": [ + "6G" + ], + "channels": [ + 1, + 5, + 9, + 13, + 17, + 21, + 25, + 29, + 33, + 37, + 41, + 45, + 49, + 53, + 57, + 61, + 65, + 69, + 73, + 77, + 81, + 85, + 89, + 93, + 97, + 101, + 105, + 109, + 113, + 117, + 121, + 125, + 129, + 133, + 137, + 141, + 145, + 149, + 153, + 157, + 161, + 165, + 169, + 173, + 177, + 181, + 185, + 189, + 193, + 197, + 201, + 205, + 209, + 213, + 217, + 221, + 225, + 229, + 233 + ], + "frequencies": [ + 5955, + 5975, + 5995, + 6015, + 6035, + 6055, + 6075, + 6095, + 6115, + 6135, + 6155, + 6175, + 6195, + 6215, + 6235, + 6255, + 6275, + 6295, + 6315, + 6335, + 6355, + 6375, + 6395, + 6415, + 6435, + 6455, + 6475, + 6495, + 6515, + 6535, + 6555, + 6575, + 6595, + 6615, + 6635, + 6655, + 6675, + 6695, + 6715, + 6735, + 6755, + 6775, + 6795, + 6815, + 6835, + 6855, + 6875, + 6895, + 6915, + 6935, + 6955, + 6975, + 6995, + 7015, + 7035, + 7055, + 7075, + 7095, + 7115 + ], + "he_mac_capa": [ + 13, + 39448, + 4160 + ], + "he_phy_capa": [ + 24604, + 34892, + 56319, + 40067, + 3089, + 0 + ], + "htmode": [ + "HE20", + "HE40", + "HE80", + "HE160", + "HE80+80" + ], + "rx_ant": 15, + "tx_ant": 15 + } + } + }, + "connectionIp": "824f816011e4@10.10.11.185:50412", + "firmware": "OpenWrt 21.02-SNAPSHOT r16399+136-c67509efd7 / TIP-v2.6.0-rc4-eebe021", + "locale": "US", + "serial": "824f816011e4", + "timestamp": 1656516572, + "uuid": 1 + } +} +``` + +## Disconnection Message + +```json +{ + "system": { + "id": 1637414624750592500, + "host": "https://owgw-owgw:17002" + }, + "payload": { + "disconnection": { + "serialNumber": "824f816011e4", + "timestamp": 1656516851 + } + } +} +``` diff --git a/developer-resources/sdk-kafka/device-event-queue.md b/developer-resources/sdk-kafka/device-event-queue.md new file mode 100644 index 0000000..f366fb6 --- /dev/null +++ b/developer-resources/sdk-kafka/device-event-queue.md @@ -0,0 +1,45 @@ +# Device Event Queue + +## Single Event (DHCP Example) + +```json +{ + "system": { + "id": 1637414624750592500, + "host": "https://owgw-owgw:17002" + }, + "payload": { + "events": { + "dhcp": [] + }, + "serial": "c44bd1005b30", + "status": { + "error": 0, + "text": "Success" + }, + "uuid": 1656049674 + } +``` + +## Multiple Events + +```json +{ + "system": { + "id": 1637414624750592500, + "host": "https://owgw-owgw:17002" + }, + "payload": { + "events": { + "dhcp": [], + "wifi": [] + }, + "serial": "0000c1018812", + "status": { + "error": 0, + "text": "Success" + }, + "uuid": 1657087470 + } +} +``` diff --git a/developer-resources/sdk-kafka/device-telemetry.md b/developer-resources/sdk-kafka/device-telemetry.md new file mode 100644 index 0000000..798cfad --- /dev/null +++ b/developer-resources/sdk-kafka/device-telemetry.md @@ -0,0 +1,2 @@ +# Device Telemetry + diff --git a/developer-resources/sdk-kafka/healthcheck.md b/developer-resources/sdk-kafka/healthcheck.md new file mode 100644 index 0000000..dc16892 --- /dev/null +++ b/developer-resources/sdk-kafka/healthcheck.md @@ -0,0 +1,75 @@ +# Healthcheck + +## Unit + +```json +{ + "system": { + "id": 1637414624750592500, + "host": "https://owgw-owgw:17002" + }, + "payload": { + "data": { + "unit": { + "memory": 20 + } + }, + "sanity": 100, + "serial": "903cb39d69c0", + "timestamp": 1657200271, + "uuid": 1657194597 + } +} +``` + +## Interfaces + Unit + +```json +{ + "system": { + "id": 1637414624750592500, + "host": "https://owgw-owgw:17002" + }, + "payload": { + "data": { + "interfaces": { + "up1v100": { + "dhcp": false, + "location": "/interfaces/1", + "warning": [ + "DHCP did not offer any leases" + ] + }, + "up2v125": { + "dhcp": false, + "location": "/interfaces/2", + "warning": [ + "DHCP did not offer any leases" + ] + }, + "up3v200": { + "dhcp": false, + "location": "/interfaces/3", + "warning": [ + "DHCP did not offer any leases" + ] + }, + "up4v150": { + "dhcp": false, + "location": "/interfaces/4", + "warning": [ + "DHCP did not offer any leases" + ] + } + }, + "unit": { + "memory": 20 + } + }, + "sanity": 43, + "serial": "0006aee53b84", + "timestamp": 1657200310, + "uuid": 1657198335 + } +} +``` diff --git a/developer-resources/sdk-kafka/provisioning-change.md b/developer-resources/sdk-kafka/provisioning-change.md new file mode 100644 index 0000000..d66fcda --- /dev/null +++ b/developer-resources/sdk-kafka/provisioning-change.md @@ -0,0 +1,51 @@ +# Provisioning Change + +## Venue Updates + +```json +{ + "system": { + "id": 1637211374533410000, + "host": "https://owprov-owprov:17005" + }, + "payload": { + "ObjectType": "Venue", + "boards": [], + "children": [], + "configurations": [], + "contacts": [], + "created": 1656163862, + "description": "For testing Purposes through Automation", + "design": "", + "deviceConfiguration": [], + "deviceRules": { + "firmwareUpgrade": "inherit", + "rcOnly": "inherit", + "rrm": "inherit" + }, + "devices": [], + "entity": "6a657863-9940-4303-ac68-4cc10d3078ec", + "id": "22146613-13f8-47a4-b21d-c2c2d214a695", + "location": "", + "managementPolicies": [], + "managementPolicy": "", + "managementRoles": [], + "maps": [], + "modified": 1656163862, + "name": "Testing Prov", + "notes": [ + { + "created": 1656163862, + "createdBy": "tip@ucentral.com", + "note": "For testing Purposes" + } + ], + "parent": "", + "sourceIP": [], + "tags": [], + "topology": [], + "variables": [] + } +} +``` + diff --git a/developer-resources/sdk-kafka/service-events.md b/developer-resources/sdk-kafka/service-events.md new file mode 100644 index 0000000..0f63e71 --- /dev/null +++ b/developer-resources/sdk-kafka/service-events.md @@ -0,0 +1,27 @@ +# Service Events + +## Keep-alive + +This message is sent by all SDK micro-services. + +```json +{ + "event": "keep-alive", + "id": 1651799646949140500, + "key": "c34b2bcafc78460025740e82922dc43ccb41d40d8d474e909a4b7065005e595e", + "privateEndPoint": "https://owanalytics-owanalytics:17009", + "publicEndPoint": "https://analytics-qa01.cicd.lab.wlan.tip.build:16009", + "type": "owanalytics", + "version": "2.6.0(69) - v2.6.0-RC3" +} +``` + +## Remove Token + +```json +{ + "event": "remove-token", + "id": 1637312489719148300, + "token": "0a6cdf595818e6da496c11a6794a6084b456425fa87181e1d350175096729f6a" +} +``` diff --git a/developer-resources/sdk-kafka/state.md b/developer-resources/sdk-kafka/state.md new file mode 100644 index 0000000..e9caeab --- /dev/null +++ b/developer-resources/sdk-kafka/state.md @@ -0,0 +1,498 @@ +# State + +## State + +```json +{ + "system": { + "id": 1637414624750592500, + "host": "https://owgw-owgw:17002" + }, + "payload": { + "serial": "50987100327b", + "state": { + "interfaces": [ + { + "clients": [ + { + "ipv6_addresses": [ + "fe80:0:0:0:6f0:21ff:fe76:cab6" + ], + "mac": "04:f0:21:76:ca:b6", + "ports": [ + "wlan0" + ] + }, + { + "ipv4_addresses": [ + "172.16.0.1" + ], + "ipv6_addresses": [ + "fe80:0:0:0:9e69:b4ff:fe60:e5f4" + ], + "mac": "9c:69:b4:60:e5:f4", + "ports": [ + "eth0" + ] + } + ], + "counters": { + "collisions": 0, + "multicast": 37, + "rx_bytes": 195056, + "rx_dropped": 0, + "rx_errors": 0, + "rx_packets": 1061, + "tx_bytes": 367918, + "tx_dropped": 0, + "tx_errors": 0, + "tx_packets": 1102 + }, + "dns_servers": [ + "8.8.8.8" + ], + "ipv4": { + "addresses": [ + "172.16.56.202/16" + ], + "dhcp_server": "172.16.0.1", + "leasetime": 600 + }, + "location": "/interfaces/0", + "name": "up0v0", + "ssids": [ + { + "associations": [ + { + "ack_signal": 0, + "ack_signal_avg": 0, + "bssid": "50:98:71:00:32:7a", + "connected": 769, + "inactive": 13, + "rssi": -49, + "rx_bytes": 7385, + "rx_duration": 9828, + "rx_packets": 56, + "rx_rate": { + "bitrate": 6000, + "chwidth": 20 + }, + "station": "04:f0:21:76:ca:b6", + "tid_stats": [ + { + "rx_msdu": 21, + "tx_msdu": 19, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 19, + "overlimit": 0, + "tx_bytes": 5549, + "tx_packets": 19 + } + }, + { + "rx_msdu": 0, + "tx_msdu": 0, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 0, + "overlimit": 0, + "tx_bytes": 0, + "tx_packets": 0 + } + }, + { + "rx_msdu": 0, + "tx_msdu": 0, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 0, + "overlimit": 0, + "tx_bytes": 0, + "tx_packets": 0 + } + }, + { + "rx_msdu": 0, + "tx_msdu": 0, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 0, + "overlimit": 0, + "tx_bytes": 0, + "tx_packets": 0 + } + }, + { + "rx_msdu": 0, + "tx_msdu": 0, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 0, + "overlimit": 0, + "tx_bytes": 0, + "tx_packets": 0 + } + }, + { + "rx_msdu": 0, + "tx_msdu": 0, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 0, + "overlimit": 0, + "tx_bytes": 0, + "tx_packets": 0 + } + }, + { + "rx_msdu": 12, + "tx_msdu": 0, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 0, + "overlimit": 0, + "tx_bytes": 0, + "tx_packets": 0 + } + }, + { + "rx_msdu": 0, + "tx_msdu": 0, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 0, + "overlimit": 0, + "tx_bytes": 0, + "tx_packets": 0 + } + }, + { + "rx_msdu": 0, + "tx_msdu": 0, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 0, + "overlimit": 0, + "tx_bytes": 0, + "tx_packets": 0 + } + }, + { + "rx_msdu": 0, + "tx_msdu": 0, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 0, + "overlimit": 0, + "tx_bytes": 0, + "tx_packets": 0 + } + }, + { + "rx_msdu": 0, + "tx_msdu": 0, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 0, + "overlimit": 0, + "tx_bytes": 0, + "tx_packets": 0 + } + }, + { + "rx_msdu": 0, + "tx_msdu": 0, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 0, + "overlimit": 0, + "tx_bytes": 0, + "tx_packets": 0 + } + }, + { + "rx_msdu": 0, + "tx_msdu": 0, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 0, + "overlimit": 0, + "tx_bytes": 0, + "tx_packets": 0 + } + }, + { + "rx_msdu": 0, + "tx_msdu": 0, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 0, + "overlimit": 0, + "tx_bytes": 0, + "tx_packets": 0 + } + }, + { + "rx_msdu": 0, + "tx_msdu": 0, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 0, + "overlimit": 0, + "tx_bytes": 0, + "tx_packets": 0 + } + }, + { + "rx_msdu": 0, + "tx_msdu": 0, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0, + "txq_stats": { + "backlog_bytes": 0, + "backlog_packets": 0, + "collisions": 0, + "drops": 0, + "ecn_marks": 0, + "flows": 0, + "overlimit": 0, + "tx_bytes": 0, + "tx_packets": 0 + } + }, + { + "rx_msdu": 0, + "tx_msdu": 4, + "tx_msdu_failed": 0, + "tx_msdu_retries": 0 + } + ], + "tx_bytes": 5798, + "tx_duration": 8121, + "tx_failed": 0, + "tx_packets": 23, + "tx_rate": { + "bitrate": 180000, + "chwidth": 40, + "ht": true, + "mcs": 12, + "sgi": true + }, + "tx_retries": 0 + } + ], + "bssid": "50:98:71:00:32:7a", + "iface": "wlan0", + "location": "/interfaces/0/ssids/0", + "mode": "ap", + "phy": "platform/soc/a000000.wifi", + "radio": { + "$ref": "#/radios/0" + }, + "ssid": "tls_ssid_wpa2" + }, + { + "bssid": "50:98:71:00:32:79", + "iface": "wlan1", + "location": "/interfaces/0/ssids/0", + "mode": "ap", + "phy": "platform/soc/a800000.wifi", + "radio": { + "$ref": "#/radios/1" + }, + "ssid": "tls_ssid_wpa2" + } + ], + "uptime": 5592 + }, + { + "counters": { + "collisions": 0, + "multicast": 0, + "rx_bytes": 0, + "rx_dropped": 0, + "rx_errors": 0, + "rx_packets": 0, + "tx_bytes": 0, + "tx_dropped": 0, + "tx_errors": 0, + "tx_packets": 0 + }, + "ipv4": { + "addresses": [ + "192.168.1.1/16" + ] + }, + "location": "/interfaces/1", + "name": "down1v0", + "uptime": 2115 + } + ], + "link-state": { + "downstream": { + "eth1": { + "carrier": 0 + } + }, + "upstream": { + "eth0": { + "carrier": 1, + "duplex": "full", + "speed": 1000 + } + } + }, + "lldp-peers": { + "downstream": {}, + "upstream": { + "eth0": [ + { + "capability": [ + "Bridge", + "Router", + "Wlan" + ], + "description": "OpenWrt 21.02-SNAPSHOT @ 00c115194c15", + "mac": "00:c1:15:19:4c:15", + "name": "CIG WF194C", + "port": "eth0" + } + ] + } + }, + "radios": [ + { + "active_ms": 1250435, + "busy_ms": 92944, + "channel": 6, + "channel_width": "40", + "noise": -99, + "phy": "platform/soc/a000000.wifi", + "receive_ms": 44474, + "transmit_ms": 3831, + "tx_power": 30 + }, + { + "active_ms": 1248675, + "busy_ms": 7493, + "channel": 100, + "channel_width": "80", + "noise": -108, + "phy": "platform/soc/a800000.wifi", + "receive_ms": 3991, + "transmit_ms": 4124, + "tx_power": 24 + } + ], + "unit": { + "load": [ + 0.103517, + 0.098634, + 0.107424 + ], + "localtime": 1657201798, + "memory": { + "buffered": 6983680, + "cached": 19980288, + "free": 141684736, + "total": 254537728 + }, + "uptime": 5748 + }, + "version": 1 + }, + "uuid": 1657200535 + } +} +``` diff --git a/developer-resources/sdk-kafka/wifi-scan.md b/developer-resources/sdk-kafka/wifi-scan.md new file mode 100644 index 0000000..cec4d9f --- /dev/null +++ b/developer-resources/sdk-kafka/wifi-scan.md @@ -0,0 +1,2348 @@ +# WiFi Scan + +## Scan Results + +```json +{ + "system": { + "id": 1637414624750592500, + "host": "https://owgw-owgw:17002" + }, + "payload": { + "serial": "903cb39d6918", + "status": { + "error": 0, + "resultCode": 1, + "scan": [ + { + "bssid": "00:06:ae:6f:6f:f6", + "capability": 305, + "channel": 52, + "frequency": 5260, + "ht_oper": "NAUAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "ies": [ + { + "content": [ + "6(B)", + "9", + "12(B)", + "18", + "24(B)", + "36", + "48", + "54" + ], + "name": "Supported Rates (Mbps)", + "type": 1 + }, + { + "content": { + "current_channel": 52 + }, + "name": "DS Params", + "type": 3 + }, + { + "content": { + "Bitmap control": { + "Bitmap Offset": 0, + "Multicast": 0, + "Partial Virtual Bitmap": "00" + }, + "DTIM count": 0, + "DTIM period": 2 + }, + "name": "Traffic Indication Map (TIM)", + "type": 5 + }, + { + "content": { + "Code": "CA", + "Environment": "Any", + "constraints": [ + { + "Country Info": { + "First Channel Number": 36, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 8 + } + }, + { + "Country Info": { + "First Channel Number": 100, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 5 + } + }, + { + "Country Info": { + "First Channel Number": 132, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 4 + } + }, + { + "Country Info": { + "First Channel Number": 149, + "Maximum Transmit Power Level (in dBm)": 30, + "Number of Channels": 5 + } + } + ] + }, + "name": "country", + "type": 7 + }, + { + "content": { + "Local Power Constraint": 3 + }, + "name": "Local Power Constraint", + "type": 32 + }, + { + "content": { + "802.11e CCA Version": { + "Available Admission Capabilities": 0, + "Channel Utilization": 0, + "QBSS Version": 2, + "Station Count": 3 + } + }, + "name": "QBSS Load", + "type": 11 + }, + { + "content": { + "Alternate Regulatory Classes": "0", + "Current Regulatory Class": 128 + }, + "name": "Supported Regulatory Classes", + "type": 59 + }, + { + "content": { + "A-MPDU Parameters": { + "MPDU Density": 0, + "Maximum Rx A-MPDU Length": 3 + }, + "Antenna Selection (ASEL) Capabilities": { + "Antenna Indices Feedback": 0, + "Antenna Indices Feedback Based Tx ASEL": 0, + "Antenna Selection Capable": 0, + "Antenna Selection Capable TXCSI": 0, + "Explicit CSI Feedback": 0, + "Rx ASEL": 0, + "Tx Sounding PPDUs": 0 + }, + "HT Capabilities Info": { + "HT Delayed Block ACK": true, + "HT Forty MHz Intolerant": false, + "HT Green Field": 12, + "HT L-SIG TXOP Protection support": false, + "HT LDPC coding capability": true, + "HT Max A-MSDU length": false, + "HT PSMP Support": false, + "HT Rx STBC": 1, + "HT Short GI for 20MHz": true, + "HT Short GI for 40MHz": true, + "HT Support channel width": true, + "HT Tx STBC": true + }, + "HT Extended Capabilities": { + "High Throughput": 0, + "MCS Feedback capability": 0, + "Reverse Direction Responder": 0, + "Time needed to transition between 20MHz and 40MHz": 0, + "Transmitter supports PCO": 0 + }, + "MCS Set": { + "Rx Bitmask Bits 0-7": "11111111", + "Rx Bitmask Bits 16-23": "00000000", + "Rx Bitmask Bits 24-31": "00000000", + "Rx Bitmask Bits 8-15": "11111111" + }, + "Transmit Beam Forming (TxBF) Capabilities": { + "Calibration": "incapable", + "Implicit TxBF capable": 0, + "Max antennae STA can support when CSI feedback required": "1 TX antenna sounding", + "Max antennae STA can support when compressed Beamforming feedback required": "1 TX antenna sounding", + "Max antennae STA can support when uncompressed Beamforming feedback required": "1 TX antenna sounding", + "Maximum number of rows of CSI explicit feedback": "1 TX antenna sounding", + "Maximum number of space time streams for which channel dimensions can be simultaneously estimated": "1 space time stream", + "Minimal grouping used for explicit feedback reports": "No grouping supported", + "Receive Null Data packet (NDP)": 0, + "Receive Staggered Sounding": 0, + "Receiver can return explicit CSI feedback": "not supported", + "Receiver can return explicit uncompressed Beamforming Feedback Matrix": "not supported", + "STA can apply TxBF using CSI explicit feedback": 0, + "STA can apply TxBF using compressed beamforming feedback matrix": 0, + "STA can apply TxBF using uncompressed beamforming feedback matrix": 0, + "STA can compress and use compressed Beamforming Feedback Matrix": "not supported", + "Transmit Beamforming": 0, + "Transmit Null Data packet (NDP)": 0, + "Transmit Staggered Sounding": 0 + } + }, + "name": "HT Capabilities", + "type": 45 + }, + { + "content": { + "Extended Capabilities": { + "20/40 BSS Coexistence Management Support": 0, + "AC Station Count": 0, + "BSS Transition": 0, + "Channel Usage": 0, + "Civic Location": 0, + "Collocated Interference Reporting": 0, + "DMS": 0, + "Diagnostics": 0, + "EBR": 0, + "Event": 0, + "Extended Channel Switching": 1, + "FMS": 0, + "Geospatial Location": 0, + "Identifier Location": 0, + "Interworking": 0, + "Location Tracking": 0, + "MSGCF Capability": 0, + "Multicast Diagnostics": 0, + "Multiple BSSID": 0, + "On-demand beacon": 0, + "PSMP Capability": 0, + "Peer U-APSD Buffer STA Support": 0, + "Proxy ARP Service": 1, + "QoS Map": 1, + "QoS Traffic Capability": 0, + "Reject Unadmitted Frame": 0, + "Reserved": 0, + "S-PSMP Support": 0, + "SSID List": 1, + "SSPN Interface": 0, + "Service Interval Granularity": "5 ms", + "TDLS Channel Switching Prohibited": 0, + "TDLS Peer PSM Support": 0, + "TDLS Prohibited": 0, + "TDLS channel switching": 0, + "TDLS support": 0, + "TFS": 0, + "TIM Broadcast": 0, + "Timing Measurement": 0, + "U-APSD Coexistence": 0, + "UTC TSF Offset": 0, + "UTF-8 SSID": 1, + "WAVE indication": 0, + "WNM-Notification": 0, + "WNM-Sleep Mode": 0 + } + }, + "name": "Extended Capabilities", + "type": 127 + }, + { + "content": { + "MCS Set": { + "Rx Bitmask Bits 0-7": "11111010", + "Rx Bitmask Bits 16-23": "00000000", + "Rx Bitmask Bits 24-31": "00000000", + "Rx Bitmask Bits 8-15": "11111111" + }, + "VHT Capabilities Info": { + "Compressed Steering Number of Beamformer Antennas Supported": "4", + "HTC-VHT Capable VHT variant HT Control field": 0, + "MU Beam-formee Capable": 0, + "MU Beam-former Capable": "5", + "Max A-MPDU Length": "unknown", + "Maximum MPDU Length": "11 454", + "Number of Sounding Dimensions": "2", + "Rx Antenna Pattern Consistency": 1, + "Rx LDPC": 1, + "Rx STBC": "1 Spatial Stream Supported", + "SU Beam-formee Capable": 1, + "SU Beam-former Capable": 1, + "Short GI for 160MHz and 80+80MHz": 0, + "Short GI for 80MHz": 1, + "Supported Channel Width Set": "Neither 160MHz nor 80+80 supported", + "Tx Antenna Pattern Consistency": 1, + "Tx STBC": 1, + "VHT Link Adaptation": "No Feedback", + "VHT TXOP PS": 0 + } + }, + "name": "VHT Capabilities Info", + "type": 191 + }, + { + "content": { + "Tx Pwr Info": { + "Local Max Tx Pwr Constraint 20MHz": 42, + "Local Max Tx Pwr Constraint 40MHz": 42, + "Local Max Tx Pwr Constraint 80MHz": 42 + } + }, + "name": "Tx Pwr Info", + "type": 195 + }, + { + "content": { + "Block": "0d 00 08 9a 40 10 04 70 4c 88 1e c1 83 04 01 2c 00 fa ff fa ff 39 1c c7 71 1c 07", + "Extension EID": "23" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Block": "f4 3f 00 81 fc ff", + "Extension EID": "24" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Block": "01 08 a9 ff 2f a9 ff 45 75 ff 65 75 ff", + "Extension EID": "26" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Auth Key Management (AKM) Suite Count": 1, + "Multicast Cipher Suite type": "AES (CCM)", + "Unicast Cipher Suite Count": 1, + "Unicast Cipher Suite List": [ + { + "Auth Key Management (AKM) OUI": "00 50 f2", + "Auth Key Management (AKM) type": "WPA" + } + ], + "WPA Version": 1, + "type": "WPA Information Element", + "vendor": "Wi-Fi : WPA / WME" + }, + "name": "Vendor Specific", + "type": 221 + }, + { + "content": { + "Ac Parameters": { + "ACI / AIFSN Field": [ + { + "ACI": "Best Effort", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 10, + "ECW Min": 4, + "TXOP Limit": 0 + }, + { + "ACI": "Background", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 10, + "ECW Min": 4, + "TXOP Limit": 0 + }, + { + "ACI": "Video", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 4, + "ECW Min": 3, + "TXOP Limit": 94 + }, + { + "ACI": "Voice", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 3, + "ECW Min": 2, + "TXOP Limit": 47 + } + ] + }, + "WME QoS Info": { + "WME QoS Info": { + "AC_BE": 0, + "AC_BK": 0, + "AC_VI": 0, + "AC_VO": 1, + "Max SP Length": "WMM AP may deliver all buffered frames (MSDUs and MMPDUs)" + } + }, + "WME Subtype": "Parameter Element", + "WME Version": 1, + "type": "WMM/WME", + "vendor": "Wi-Fi : WPA / WME" + }, + "name": "Vendor Specific", + "type": 221 + } + ], + "last_seen": 2730, + "signal": 3, + "ssid": "tls_ssid_wpa_eap_5g", + "tsf": 11150847997, + "vht_oper": "AToA/P8=" + }, + { + "bssid": "02:06:ae:6f:6f:f6", + "capability": 305, + "channel": 52, + "frequency": 5260, + "ht_oper": "NAUAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "ies": [ + { + "content": [ + "6(B)", + "9", + "12(B)", + "18", + "24(B)", + "36", + "48", + "54" + ], + "name": "Supported Rates (Mbps)", + "type": 1 + }, + { + "content": { + "current_channel": 52 + }, + "name": "DS Params", + "type": 3 + }, + { + "content": { + "Bitmap control": { + "Bitmap Offset": 0, + "Multicast": 0, + "Partial Virtual Bitmap": "00" + }, + "DTIM count": 0, + "DTIM period": 2 + }, + "name": "Traffic Indication Map (TIM)", + "type": 5 + }, + { + "content": { + "Code": "CA", + "Environment": "Any", + "constraints": [ + { + "Country Info": { + "First Channel Number": 36, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 8 + } + }, + { + "Country Info": { + "First Channel Number": 100, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 5 + } + }, + { + "Country Info": { + "First Channel Number": 132, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 4 + } + }, + { + "Country Info": { + "First Channel Number": 149, + "Maximum Transmit Power Level (in dBm)": 30, + "Number of Channels": 5 + } + } + ] + }, + "name": "country", + "type": 7 + }, + { + "content": { + "Local Power Constraint": 3 + }, + "name": "Local Power Constraint", + "type": 32 + }, + { + "content": { + "Auth Key Management (AKM) List": [ + { + "Auth Key Management (AKM) OUI": "00:0f:ac", + "Auth Key Management (AKM) type": "WPA" + }, + { + "Auth Key Management (AKM) OUI": "00:0f:ac", + "Auth Key Management (AKM) type": "WPA (SHA256)" + } + ], + "Auth Key Management (AKM) Suite Count": 2, + "Group Cipher Suite OUI": "00:0f:ac", + "Group Cipher Suite type": "AES (CCM)", + "Pairwise Cipher Suite Count": 1, + "Pairwise Cipher Suite List": [ + { + "Group Cipher Suite OUI": "00:0f:ac", + "Group Cipher Suite type": "AES (CCM)" + } + ], + "RSN Capabilities": { + "Management Frame Protection Capable": 1, + "Management Frame Protection Required": 0, + "PeerKey Enabled": 0, + "RSN GTKSA Replay Counter capabilities": "1 replay counter per PTKSA/GTKSA/STAKeySA", + "RSN No Pairwise capabilities": 0, + "RSN PTKSA Replay Counter capabilities": "16 replay counters per PTKSA/GTKSA/STAKeySA", + "RSN Pre-Auth capabilities": 0 + }, + "RSN Version": 1 + }, + "name": "RSN", + "type": 48 + }, + { + "content": { + "802.11e CCA Version": { + "Available Admission Capabilities": 32512, + "Channel Utilization": 0, + "QBSS Version": 2, + "Station Count": 3 + } + }, + "name": "QBSS Load", + "type": 11 + }, + { + "content": { + "Alternate Regulatory Classes": "0", + "Current Regulatory Class": 128 + }, + "name": "Supported Regulatory Classes", + "type": 59 + }, + { + "content": { + "A-MPDU Parameters": { + "MPDU Density": 0, + "Maximum Rx A-MPDU Length": 3 + }, + "Antenna Selection (ASEL) Capabilities": { + "Antenna Indices Feedback": 0, + "Antenna Indices Feedback Based Tx ASEL": 0, + "Antenna Selection Capable": 0, + "Antenna Selection Capable TXCSI": 0, + "Explicit CSI Feedback": 0, + "Rx ASEL": 0, + "Tx Sounding PPDUs": 0 + }, + "HT Capabilities Info": { + "HT Delayed Block ACK": true, + "HT Forty MHz Intolerant": false, + "HT Green Field": 12, + "HT L-SIG TXOP Protection support": false, + "HT LDPC coding capability": true, + "HT Max A-MSDU length": false, + "HT PSMP Support": false, + "HT Rx STBC": 1, + "HT Short GI for 20MHz": true, + "HT Short GI for 40MHz": true, + "HT Support channel width": true, + "HT Tx STBC": true + }, + "HT Extended Capabilities": { + "High Throughput": 0, + "MCS Feedback capability": 0, + "Reverse Direction Responder": 0, + "Time needed to transition between 20MHz and 40MHz": 0, + "Transmitter supports PCO": 0 + }, + "MCS Set": { + "Rx Bitmask Bits 0-7": "11111111", + "Rx Bitmask Bits 16-23": "00000000", + "Rx Bitmask Bits 24-31": "00000000", + "Rx Bitmask Bits 8-15": "11111111" + }, + "Transmit Beam Forming (TxBF) Capabilities": { + "Calibration": "incapable", + "Implicit TxBF capable": 0, + "Max antennae STA can support when CSI feedback required": "1 TX antenna sounding", + "Max antennae STA can support when compressed Beamforming feedback required": "1 TX antenna sounding", + "Max antennae STA can support when uncompressed Beamforming feedback required": "1 TX antenna sounding", + "Maximum number of rows of CSI explicit feedback": "1 TX antenna sounding", + "Maximum number of space time streams for which channel dimensions can be simultaneously estimated": "1 space time stream", + "Minimal grouping used for explicit feedback reports": "No grouping supported", + "Receive Null Data packet (NDP)": 0, + "Receive Staggered Sounding": 0, + "Receiver can return explicit CSI feedback": "not supported", + "Receiver can return explicit uncompressed Beamforming Feedback Matrix": "not supported", + "STA can apply TxBF using CSI explicit feedback": 0, + "STA can apply TxBF using compressed beamforming feedback matrix": 0, + "STA can apply TxBF using uncompressed beamforming feedback matrix": 0, + "STA can compress and use compressed Beamforming Feedback Matrix": "not supported", + "Transmit Beamforming": 0, + "Transmit Null Data packet (NDP)": 0, + "Transmit Staggered Sounding": 0 + } + }, + "name": "HT Capabilities", + "type": 45 + }, + { + "content": { + "Extended Capabilities": { + "20/40 BSS Coexistence Management Support": 0, + "AC Station Count": 0, + "BSS Transition": 0, + "Channel Usage": 0, + "Civic Location": 0, + "Collocated Interference Reporting": 0, + "DMS": 0, + "Diagnostics": 0, + "EBR": 0, + "Event": 0, + "Extended Channel Switching": 1, + "FMS": 0, + "Geospatial Location": 0, + "Identifier Location": 0, + "Interworking": 0, + "Location Tracking": 0, + "MSGCF Capability": 0, + "Multicast Diagnostics": 0, + "Multiple BSSID": 0, + "On-demand beacon": 0, + "PSMP Capability": 0, + "Peer U-APSD Buffer STA Support": 0, + "Proxy ARP Service": 1, + "QoS Map": 1, + "QoS Traffic Capability": 0, + "Reject Unadmitted Frame": 0, + "Reserved": 0, + "S-PSMP Support": 0, + "SSID List": 1, + "SSPN Interface": 0, + "Service Interval Granularity": "5 ms", + "TDLS Channel Switching Prohibited": 0, + "TDLS Peer PSM Support": 0, + "TDLS Prohibited": 0, + "TDLS channel switching": 0, + "TDLS support": 0, + "TFS": 0, + "TIM Broadcast": 0, + "Timing Measurement": 0, + "U-APSD Coexistence": 0, + "UTC TSF Offset": 0, + "UTF-8 SSID": 1, + "WAVE indication": 0, + "WNM-Notification": 0, + "WNM-Sleep Mode": 0 + } + }, + "name": "Extended Capabilities", + "type": 127 + }, + { + "content": { + "MCS Set": { + "Rx Bitmask Bits 0-7": "11111010", + "Rx Bitmask Bits 16-23": "00000000", + "Rx Bitmask Bits 24-31": "00000000", + "Rx Bitmask Bits 8-15": "11111111" + }, + "VHT Capabilities Info": { + "Compressed Steering Number of Beamformer Antennas Supported": "4", + "HTC-VHT Capable VHT variant HT Control field": 0, + "MU Beam-formee Capable": 0, + "MU Beam-former Capable": "5", + "Max A-MPDU Length": "unknown", + "Maximum MPDU Length": "11 454", + "Number of Sounding Dimensions": "2", + "Rx Antenna Pattern Consistency": 1, + "Rx LDPC": 1, + "Rx STBC": "1 Spatial Stream Supported", + "SU Beam-formee Capable": 1, + "SU Beam-former Capable": 1, + "Short GI for 160MHz and 80+80MHz": 0, + "Short GI for 80MHz": 1, + "Supported Channel Width Set": "Neither 160MHz nor 80+80 supported", + "Tx Antenna Pattern Consistency": 1, + "Tx STBC": 1, + "VHT Link Adaptation": "No Feedback", + "VHT TXOP PS": 0 + } + }, + "name": "VHT Capabilities Info", + "type": 191 + }, + { + "content": { + "Tx Pwr Info": { + "Local Max Tx Pwr Constraint 20MHz": 42, + "Local Max Tx Pwr Constraint 40MHz": 42, + "Local Max Tx Pwr Constraint 80MHz": 42 + } + }, + "name": "Tx Pwr Info", + "type": 195 + }, + { + "content": { + "Block": "0d 00 08 9a 40 10 04 70 4c 88 1e c1 83 04 01 2c 00 fa ff fa ff 39 1c c7 71 1c 07", + "Extension EID": "23" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Block": "f4 3f 00 81 fc ff", + "Extension EID": "24" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Block": "01 08 a9 ff 2f a9 ff 45 75 ff 65 75 ff", + "Extension EID": "26" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Ac Parameters": { + "ACI / AIFSN Field": [ + { + "ACI": "Best Effort", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 10, + "ECW Min": 4, + "TXOP Limit": 0 + }, + { + "ACI": "Background", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 10, + "ECW Min": 4, + "TXOP Limit": 0 + }, + { + "ACI": "Video", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 4, + "ECW Min": 3, + "TXOP Limit": 94 + }, + { + "ACI": "Voice", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 3, + "ECW Min": 2, + "TXOP Limit": 47 + } + ] + }, + "WME QoS Info": { + "WME QoS Info": { + "AC_BE": 0, + "AC_BK": 0, + "AC_VI": 0, + "AC_VO": 0, + "Max SP Length": "WMM AP may deliver all buffered frames (MSDUs and MMPDUs)" + } + }, + "WME Subtype": "Parameter Element", + "WME Version": 1, + "type": "WMM/WME", + "vendor": "Wi-Fi : WPA / WME" + }, + "name": "Vendor Specific", + "type": 221 + } + ], + "last_seen": 2800, + "signal": 3, + "ssid": "tls_ssid_wpa2_eap_5g", + "tsf": 11150779731, + "vht_oper": "AToA/P8=" + }, + { + "bssid": "06:06:ae:6f:6f:f6", + "capability": 305, + "channel": 52, + "frequency": 5260, + "ht_oper": "NAUAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "ies": [ + { + "content": [ + "6(B)", + "9", + "12(B)", + "18", + "24(B)", + "36", + "48", + "54" + ], + "name": "Supported Rates (Mbps)", + "type": 1 + }, + { + "content": { + "current_channel": 52 + }, + "name": "DS Params", + "type": 3 + }, + { + "content": { + "Bitmap control": { + "Bitmap Offset": 0, + "Multicast": 0, + "Partial Virtual Bitmap": "00" + }, + "DTIM count": 0, + "DTIM period": 2 + }, + "name": "Traffic Indication Map (TIM)", + "type": 5 + }, + { + "content": { + "Code": "CA", + "Environment": "Any", + "constraints": [ + { + "Country Info": { + "First Channel Number": 36, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 8 + } + }, + { + "Country Info": { + "First Channel Number": 100, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 5 + } + }, + { + "Country Info": { + "First Channel Number": 132, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 4 + } + }, + { + "Country Info": { + "First Channel Number": 149, + "Maximum Transmit Power Level (in dBm)": 30, + "Number of Channels": 5 + } + } + ] + }, + "name": "country", + "type": 7 + }, + { + "content": { + "Local Power Constraint": 3 + }, + "name": "Local Power Constraint", + "type": 32 + }, + { + "content": { + "Auth Key Management (AKM) List": [ + { + "Auth Key Management (AKM) OUI": "00:0f:ac", + "Auth Key Management (AKM) type": "WPA (SHA256)" + } + ], + "Auth Key Management (AKM) Suite Count": 1, + "Group Cipher Suite OUI": "00:0f:ac", + "Group Cipher Suite type": "AES (CCM)", + "Pairwise Cipher Suite Count": 1, + "Pairwise Cipher Suite List": [ + { + "Group Cipher Suite OUI": "00:0f:ac", + "Group Cipher Suite type": "AES (CCM)" + } + ], + "RSN Capabilities": { + "Management Frame Protection Capable": 1, + "Management Frame Protection Required": 1, + "PeerKey Enabled": 0, + "RSN GTKSA Replay Counter capabilities": "1 replay counter per PTKSA/GTKSA/STAKeySA", + "RSN No Pairwise capabilities": 0, + "RSN PTKSA Replay Counter capabilities": "16 replay counters per PTKSA/GTKSA/STAKeySA", + "RSN Pre-Auth capabilities": 0 + }, + "RSN Version": 1 + }, + "name": "RSN", + "type": 48 + }, + { + "content": { + "802.11e CCA Version": { + "Available Admission Capabilities": 32512, + "Channel Utilization": 0, + "QBSS Version": 2, + "Station Count": 3 + } + }, + "name": "QBSS Load", + "type": 11 + }, + { + "content": { + "Alternate Regulatory Classes": "0", + "Current Regulatory Class": 128 + }, + "name": "Supported Regulatory Classes", + "type": 59 + }, + { + "content": { + "A-MPDU Parameters": { + "MPDU Density": 0, + "Maximum Rx A-MPDU Length": 3 + }, + "Antenna Selection (ASEL) Capabilities": { + "Antenna Indices Feedback": 0, + "Antenna Indices Feedback Based Tx ASEL": 0, + "Antenna Selection Capable": 0, + "Antenna Selection Capable TXCSI": 0, + "Explicit CSI Feedback": 0, + "Rx ASEL": 0, + "Tx Sounding PPDUs": 0 + }, + "HT Capabilities Info": { + "HT Delayed Block ACK": true, + "HT Forty MHz Intolerant": false, + "HT Green Field": 12, + "HT L-SIG TXOP Protection support": false, + "HT LDPC coding capability": true, + "HT Max A-MSDU length": false, + "HT PSMP Support": false, + "HT Rx STBC": 1, + "HT Short GI for 20MHz": true, + "HT Short GI for 40MHz": true, + "HT Support channel width": true, + "HT Tx STBC": true + }, + "HT Extended Capabilities": { + "High Throughput": 0, + "MCS Feedback capability": 0, + "Reverse Direction Responder": 0, + "Time needed to transition between 20MHz and 40MHz": 0, + "Transmitter supports PCO": 0 + }, + "MCS Set": { + "Rx Bitmask Bits 0-7": "11111111", + "Rx Bitmask Bits 16-23": "00000000", + "Rx Bitmask Bits 24-31": "00000000", + "Rx Bitmask Bits 8-15": "11111111" + }, + "Transmit Beam Forming (TxBF) Capabilities": { + "Calibration": "incapable", + "Implicit TxBF capable": 0, + "Max antennae STA can support when CSI feedback required": "1 TX antenna sounding", + "Max antennae STA can support when compressed Beamforming feedback required": "1 TX antenna sounding", + "Max antennae STA can support when uncompressed Beamforming feedback required": "1 TX antenna sounding", + "Maximum number of rows of CSI explicit feedback": "1 TX antenna sounding", + "Maximum number of space time streams for which channel dimensions can be simultaneously estimated": "1 space time stream", + "Minimal grouping used for explicit feedback reports": "No grouping supported", + "Receive Null Data packet (NDP)": 0, + "Receive Staggered Sounding": 0, + "Receiver can return explicit CSI feedback": "not supported", + "Receiver can return explicit uncompressed Beamforming Feedback Matrix": "not supported", + "STA can apply TxBF using CSI explicit feedback": 0, + "STA can apply TxBF using compressed beamforming feedback matrix": 0, + "STA can apply TxBF using uncompressed beamforming feedback matrix": 0, + "STA can compress and use compressed Beamforming Feedback Matrix": "not supported", + "Transmit Beamforming": 0, + "Transmit Null Data packet (NDP)": 0, + "Transmit Staggered Sounding": 0 + } + }, + "name": "HT Capabilities", + "type": 45 + }, + { + "content": { + "Extended Capabilities": { + "20/40 BSS Coexistence Management Support": 0, + "AC Station Count": 0, + "BSS Transition": 0, + "Channel Usage": 0, + "Civic Location": 0, + "Collocated Interference Reporting": 0, + "DMS": 0, + "Diagnostics": 0, + "EBR": 0, + "Event": 0, + "Extended Channel Switching": 1, + "FMS": 0, + "Geospatial Location": 0, + "Identifier Location": 0, + "Interworking": 0, + "Location Tracking": 0, + "MSGCF Capability": 0, + "Multicast Diagnostics": 0, + "Multiple BSSID": 0, + "On-demand beacon": 0, + "PSMP Capability": 0, + "Peer U-APSD Buffer STA Support": 0, + "Proxy ARP Service": 1, + "QoS Map": 1, + "QoS Traffic Capability": 0, + "Reject Unadmitted Frame": 0, + "Reserved": 0, + "S-PSMP Support": 0, + "SSID List": 1, + "SSPN Interface": 0, + "Service Interval Granularity": "5 ms", + "TDLS Channel Switching Prohibited": 0, + "TDLS Peer PSM Support": 0, + "TDLS Prohibited": 0, + "TDLS channel switching": 0, + "TDLS support": 0, + "TFS": 0, + "TIM Broadcast": 0, + "Timing Measurement": 0, + "U-APSD Coexistence": 0, + "UTC TSF Offset": 0, + "UTF-8 SSID": 1, + "WAVE indication": 0, + "WNM-Notification": 0, + "WNM-Sleep Mode": 0 + } + }, + "name": "Extended Capabilities", + "type": 127 + }, + { + "content": { + "MCS Set": { + "Rx Bitmask Bits 0-7": "11111010", + "Rx Bitmask Bits 16-23": "00000000", + "Rx Bitmask Bits 24-31": "00000000", + "Rx Bitmask Bits 8-15": "11111111" + }, + "VHT Capabilities Info": { + "Compressed Steering Number of Beamformer Antennas Supported": "4", + "HTC-VHT Capable VHT variant HT Control field": 0, + "MU Beam-formee Capable": 0, + "MU Beam-former Capable": "5", + "Max A-MPDU Length": "unknown", + "Maximum MPDU Length": "11 454", + "Number of Sounding Dimensions": "2", + "Rx Antenna Pattern Consistency": 1, + "Rx LDPC": 1, + "Rx STBC": "1 Spatial Stream Supported", + "SU Beam-formee Capable": 1, + "SU Beam-former Capable": 1, + "Short GI for 160MHz and 80+80MHz": 0, + "Short GI for 80MHz": 1, + "Supported Channel Width Set": "Neither 160MHz nor 80+80 supported", + "Tx Antenna Pattern Consistency": 1, + "Tx STBC": 1, + "VHT Link Adaptation": "No Feedback", + "VHT TXOP PS": 0 + } + }, + "name": "VHT Capabilities Info", + "type": 191 + }, + { + "content": { + "Tx Pwr Info": { + "Local Max Tx Pwr Constraint 20MHz": 42, + "Local Max Tx Pwr Constraint 40MHz": 42, + "Local Max Tx Pwr Constraint 80MHz": 42 + } + }, + "name": "Tx Pwr Info", + "type": 195 + }, + { + "content": { + "Block": "0d 00 08 9a 40 10 04 70 4c 88 1e c1 83 04 01 2c 00 fa ff fa ff 39 1c c7 71 1c 07", + "Extension EID": "23" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Block": "f4 3f 00 81 fc ff", + "Extension EID": "24" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Block": "01 08 a9 ff 2f a9 ff 45 75 ff 65 75 ff", + "Extension EID": "26" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Ac Parameters": { + "ACI / AIFSN Field": [ + { + "ACI": "Best Effort", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 10, + "ECW Min": 4, + "TXOP Limit": 0 + }, + { + "ACI": "Background", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 10, + "ECW Min": 4, + "TXOP Limit": 0 + }, + { + "ACI": "Video", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 4, + "ECW Min": 3, + "TXOP Limit": 94 + }, + { + "ACI": "Voice", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 3, + "ECW Min": 2, + "TXOP Limit": 47 + } + ] + }, + "WME QoS Info": { + "WME QoS Info": { + "AC_BE": 0, + "AC_BK": 0, + "AC_VI": 0, + "AC_VO": 0, + "Max SP Length": "WMM AP may deliver all buffered frames (MSDUs and MMPDUs)" + } + }, + "WME Subtype": "Parameter Element", + "WME Version": 1, + "type": "WMM/WME", + "vendor": "Wi-Fi : WPA / WME" + }, + "name": "Vendor Specific", + "type": 221 + } + ], + "last_seen": 2760, + "signal": 3, + "ssid": "tls_ssid_wpa3_eap_5g", + "tsf": 11150813864, + "vht_oper": "AToA/P8=" + } + ], + "text": "Success" + }, + "uuid": 1657164026 + } +}{ + "system": { + "id": 1637414624750592500, + "host": "https://owgw-owgw:17002" + }, + "payload": { + "serial": "903cb39d6918", + "status": { + "error": 0, + "resultCode": 1, + "scan": [ + { + "bssid": "00:06:ae:6f:6f:f6", + "capability": 305, + "channel": 52, + "frequency": 5260, + "ht_oper": "NAUAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "ies": [ + { + "content": [ + "6(B)", + "9", + "12(B)", + "18", + "24(B)", + "36", + "48", + "54" + ], + "name": "Supported Rates (Mbps)", + "type": 1 + }, + { + "content": { + "current_channel": 52 + }, + "name": "DS Params", + "type": 3 + }, + { + "content": { + "Bitmap control": { + "Bitmap Offset": 0, + "Multicast": 0, + "Partial Virtual Bitmap": "00" + }, + "DTIM count": 0, + "DTIM period": 2 + }, + "name": "Traffic Indication Map (TIM)", + "type": 5 + }, + { + "content": { + "Code": "CA", + "Environment": "Any", + "constraints": [ + { + "Country Info": { + "First Channel Number": 36, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 8 + } + }, + { + "Country Info": { + "First Channel Number": 100, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 5 + } + }, + { + "Country Info": { + "First Channel Number": 132, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 4 + } + }, + { + "Country Info": { + "First Channel Number": 149, + "Maximum Transmit Power Level (in dBm)": 30, + "Number of Channels": 5 + } + } + ] + }, + "name": "country", + "type": 7 + }, + { + "content": { + "Local Power Constraint": 3 + }, + "name": "Local Power Constraint", + "type": 32 + }, + { + "content": { + "802.11e CCA Version": { + "Available Admission Capabilities": 0, + "Channel Utilization": 0, + "QBSS Version": 2, + "Station Count": 3 + } + }, + "name": "QBSS Load", + "type": 11 + }, + { + "content": { + "Alternate Regulatory Classes": "0", + "Current Regulatory Class": 128 + }, + "name": "Supported Regulatory Classes", + "type": 59 + }, + { + "content": { + "A-MPDU Parameters": { + "MPDU Density": 0, + "Maximum Rx A-MPDU Length": 3 + }, + "Antenna Selection (ASEL) Capabilities": { + "Antenna Indices Feedback": 0, + "Antenna Indices Feedback Based Tx ASEL": 0, + "Antenna Selection Capable": 0, + "Antenna Selection Capable TXCSI": 0, + "Explicit CSI Feedback": 0, + "Rx ASEL": 0, + "Tx Sounding PPDUs": 0 + }, + "HT Capabilities Info": { + "HT Delayed Block ACK": true, + "HT Forty MHz Intolerant": false, + "HT Green Field": 12, + "HT L-SIG TXOP Protection support": false, + "HT LDPC coding capability": true, + "HT Max A-MSDU length": false, + "HT PSMP Support": false, + "HT Rx STBC": 1, + "HT Short GI for 20MHz": true, + "HT Short GI for 40MHz": true, + "HT Support channel width": true, + "HT Tx STBC": true + }, + "HT Extended Capabilities": { + "High Throughput": 0, + "MCS Feedback capability": 0, + "Reverse Direction Responder": 0, + "Time needed to transition between 20MHz and 40MHz": 0, + "Transmitter supports PCO": 0 + }, + "MCS Set": { + "Rx Bitmask Bits 0-7": "11111111", + "Rx Bitmask Bits 16-23": "00000000", + "Rx Bitmask Bits 24-31": "00000000", + "Rx Bitmask Bits 8-15": "11111111" + }, + "Transmit Beam Forming (TxBF) Capabilities": { + "Calibration": "incapable", + "Implicit TxBF capable": 0, + "Max antennae STA can support when CSI feedback required": "1 TX antenna sounding", + "Max antennae STA can support when compressed Beamforming feedback required": "1 TX antenna sounding", + "Max antennae STA can support when uncompressed Beamforming feedback required": "1 TX antenna sounding", + "Maximum number of rows of CSI explicit feedback": "1 TX antenna sounding", + "Maximum number of space time streams for which channel dimensions can be simultaneously estimated": "1 space time stream", + "Minimal grouping used for explicit feedback reports": "No grouping supported", + "Receive Null Data packet (NDP)": 0, + "Receive Staggered Sounding": 0, + "Receiver can return explicit CSI feedback": "not supported", + "Receiver can return explicit uncompressed Beamforming Feedback Matrix": "not supported", + "STA can apply TxBF using CSI explicit feedback": 0, + "STA can apply TxBF using compressed beamforming feedback matrix": 0, + "STA can apply TxBF using uncompressed beamforming feedback matrix": 0, + "STA can compress and use compressed Beamforming Feedback Matrix": "not supported", + "Transmit Beamforming": 0, + "Transmit Null Data packet (NDP)": 0, + "Transmit Staggered Sounding": 0 + } + }, + "name": "HT Capabilities", + "type": 45 + }, + { + "content": { + "Extended Capabilities": { + "20/40 BSS Coexistence Management Support": 0, + "AC Station Count": 0, + "BSS Transition": 0, + "Channel Usage": 0, + "Civic Location": 0, + "Collocated Interference Reporting": 0, + "DMS": 0, + "Diagnostics": 0, + "EBR": 0, + "Event": 0, + "Extended Channel Switching": 1, + "FMS": 0, + "Geospatial Location": 0, + "Identifier Location": 0, + "Interworking": 0, + "Location Tracking": 0, + "MSGCF Capability": 0, + "Multicast Diagnostics": 0, + "Multiple BSSID": 0, + "On-demand beacon": 0, + "PSMP Capability": 0, + "Peer U-APSD Buffer STA Support": 0, + "Proxy ARP Service": 1, + "QoS Map": 1, + "QoS Traffic Capability": 0, + "Reject Unadmitted Frame": 0, + "Reserved": 0, + "S-PSMP Support": 0, + "SSID List": 1, + "SSPN Interface": 0, + "Service Interval Granularity": "5 ms", + "TDLS Channel Switching Prohibited": 0, + "TDLS Peer PSM Support": 0, + "TDLS Prohibited": 0, + "TDLS channel switching": 0, + "TDLS support": 0, + "TFS": 0, + "TIM Broadcast": 0, + "Timing Measurement": 0, + "U-APSD Coexistence": 0, + "UTC TSF Offset": 0, + "UTF-8 SSID": 1, + "WAVE indication": 0, + "WNM-Notification": 0, + "WNM-Sleep Mode": 0 + } + }, + "name": "Extended Capabilities", + "type": 127 + }, + { + "content": { + "MCS Set": { + "Rx Bitmask Bits 0-7": "11111010", + "Rx Bitmask Bits 16-23": "00000000", + "Rx Bitmask Bits 24-31": "00000000", + "Rx Bitmask Bits 8-15": "11111111" + }, + "VHT Capabilities Info": { + "Compressed Steering Number of Beamformer Antennas Supported": "4", + "HTC-VHT Capable VHT variant HT Control field": 0, + "MU Beam-formee Capable": 0, + "MU Beam-former Capable": "5", + "Max A-MPDU Length": "unknown", + "Maximum MPDU Length": "11 454", + "Number of Sounding Dimensions": "2", + "Rx Antenna Pattern Consistency": 1, + "Rx LDPC": 1, + "Rx STBC": "1 Spatial Stream Supported", + "SU Beam-formee Capable": 1, + "SU Beam-former Capable": 1, + "Short GI for 160MHz and 80+80MHz": 0, + "Short GI for 80MHz": 1, + "Supported Channel Width Set": "Neither 160MHz nor 80+80 supported", + "Tx Antenna Pattern Consistency": 1, + "Tx STBC": 1, + "VHT Link Adaptation": "No Feedback", + "VHT TXOP PS": 0 + } + }, + "name": "VHT Capabilities Info", + "type": 191 + }, + { + "content": { + "Tx Pwr Info": { + "Local Max Tx Pwr Constraint 20MHz": 42, + "Local Max Tx Pwr Constraint 40MHz": 42, + "Local Max Tx Pwr Constraint 80MHz": 42 + } + }, + "name": "Tx Pwr Info", + "type": 195 + }, + { + "content": { + "Block": "0d 00 08 9a 40 10 04 70 4c 88 1e c1 83 04 01 2c 00 fa ff fa ff 39 1c c7 71 1c 07", + "Extension EID": "23" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Block": "f4 3f 00 81 fc ff", + "Extension EID": "24" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Block": "01 08 a9 ff 2f a9 ff 45 75 ff 65 75 ff", + "Extension EID": "26" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Auth Key Management (AKM) Suite Count": 1, + "Multicast Cipher Suite type": "AES (CCM)", + "Unicast Cipher Suite Count": 1, + "Unicast Cipher Suite List": [ + { + "Auth Key Management (AKM) OUI": "00 50 f2", + "Auth Key Management (AKM) type": "WPA" + } + ], + "WPA Version": 1, + "type": "WPA Information Element", + "vendor": "Wi-Fi : WPA / WME" + }, + "name": "Vendor Specific", + "type": 221 + }, + { + "content": { + "Ac Parameters": { + "ACI / AIFSN Field": [ + { + "ACI": "Best Effort", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 10, + "ECW Min": 4, + "TXOP Limit": 0 + }, + { + "ACI": "Background", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 10, + "ECW Min": 4, + "TXOP Limit": 0 + }, + { + "ACI": "Video", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 4, + "ECW Min": 3, + "TXOP Limit": 94 + }, + { + "ACI": "Voice", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 3, + "ECW Min": 2, + "TXOP Limit": 47 + } + ] + }, + "WME QoS Info": { + "WME QoS Info": { + "AC_BE": 0, + "AC_BK": 0, + "AC_VI": 0, + "AC_VO": 1, + "Max SP Length": "WMM AP may deliver all buffered frames (MSDUs and MMPDUs)" + } + }, + "WME Subtype": "Parameter Element", + "WME Version": 1, + "type": "WMM/WME", + "vendor": "Wi-Fi : WPA / WME" + }, + "name": "Vendor Specific", + "type": 221 + } + ], + "last_seen": 2730, + "signal": 3, + "ssid": "tls_ssid_wpa_eap_5g", + "tsf": 11150847997, + "vht_oper": "AToA/P8=" + }, + { + "bssid": "02:06:ae:6f:6f:f6", + "capability": 305, + "channel": 52, + "frequency": 5260, + "ht_oper": "NAUAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "ies": [ + { + "content": [ + "6(B)", + "9", + "12(B)", + "18", + "24(B)", + "36", + "48", + "54" + ], + "name": "Supported Rates (Mbps)", + "type": 1 + }, + { + "content": { + "current_channel": 52 + }, + "name": "DS Params", + "type": 3 + }, + { + "content": { + "Bitmap control": { + "Bitmap Offset": 0, + "Multicast": 0, + "Partial Virtual Bitmap": "00" + }, + "DTIM count": 0, + "DTIM period": 2 + }, + "name": "Traffic Indication Map (TIM)", + "type": 5 + }, + { + "content": { + "Code": "CA", + "Environment": "Any", + "constraints": [ + { + "Country Info": { + "First Channel Number": 36, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 8 + } + }, + { + "Country Info": { + "First Channel Number": 100, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 5 + } + }, + { + "Country Info": { + "First Channel Number": 132, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 4 + } + }, + { + "Country Info": { + "First Channel Number": 149, + "Maximum Transmit Power Level (in dBm)": 30, + "Number of Channels": 5 + } + } + ] + }, + "name": "country", + "type": 7 + }, + { + "content": { + "Local Power Constraint": 3 + }, + "name": "Local Power Constraint", + "type": 32 + }, + { + "content": { + "Auth Key Management (AKM) List": [ + { + "Auth Key Management (AKM) OUI": "00:0f:ac", + "Auth Key Management (AKM) type": "WPA" + }, + { + "Auth Key Management (AKM) OUI": "00:0f:ac", + "Auth Key Management (AKM) type": "WPA (SHA256)" + } + ], + "Auth Key Management (AKM) Suite Count": 2, + "Group Cipher Suite OUI": "00:0f:ac", + "Group Cipher Suite type": "AES (CCM)", + "Pairwise Cipher Suite Count": 1, + "Pairwise Cipher Suite List": [ + { + "Group Cipher Suite OUI": "00:0f:ac", + "Group Cipher Suite type": "AES (CCM)" + } + ], + "RSN Capabilities": { + "Management Frame Protection Capable": 1, + "Management Frame Protection Required": 0, + "PeerKey Enabled": 0, + "RSN GTKSA Replay Counter capabilities": "1 replay counter per PTKSA/GTKSA/STAKeySA", + "RSN No Pairwise capabilities": 0, + "RSN PTKSA Replay Counter capabilities": "16 replay counters per PTKSA/GTKSA/STAKeySA", + "RSN Pre-Auth capabilities": 0 + }, + "RSN Version": 1 + }, + "name": "RSN", + "type": 48 + }, + { + "content": { + "802.11e CCA Version": { + "Available Admission Capabilities": 32512, + "Channel Utilization": 0, + "QBSS Version": 2, + "Station Count": 3 + } + }, + "name": "QBSS Load", + "type": 11 + }, + { + "content": { + "Alternate Regulatory Classes": "0", + "Current Regulatory Class": 128 + }, + "name": "Supported Regulatory Classes", + "type": 59 + }, + { + "content": { + "A-MPDU Parameters": { + "MPDU Density": 0, + "Maximum Rx A-MPDU Length": 3 + }, + "Antenna Selection (ASEL) Capabilities": { + "Antenna Indices Feedback": 0, + "Antenna Indices Feedback Based Tx ASEL": 0, + "Antenna Selection Capable": 0, + "Antenna Selection Capable TXCSI": 0, + "Explicit CSI Feedback": 0, + "Rx ASEL": 0, + "Tx Sounding PPDUs": 0 + }, + "HT Capabilities Info": { + "HT Delayed Block ACK": true, + "HT Forty MHz Intolerant": false, + "HT Green Field": 12, + "HT L-SIG TXOP Protection support": false, + "HT LDPC coding capability": true, + "HT Max A-MSDU length": false, + "HT PSMP Support": false, + "HT Rx STBC": 1, + "HT Short GI for 20MHz": true, + "HT Short GI for 40MHz": true, + "HT Support channel width": true, + "HT Tx STBC": true + }, + "HT Extended Capabilities": { + "High Throughput": 0, + "MCS Feedback capability": 0, + "Reverse Direction Responder": 0, + "Time needed to transition between 20MHz and 40MHz": 0, + "Transmitter supports PCO": 0 + }, + "MCS Set": { + "Rx Bitmask Bits 0-7": "11111111", + "Rx Bitmask Bits 16-23": "00000000", + "Rx Bitmask Bits 24-31": "00000000", + "Rx Bitmask Bits 8-15": "11111111" + }, + "Transmit Beam Forming (TxBF) Capabilities": { + "Calibration": "incapable", + "Implicit TxBF capable": 0, + "Max antennae STA can support when CSI feedback required": "1 TX antenna sounding", + "Max antennae STA can support when compressed Beamforming feedback required": "1 TX antenna sounding", + "Max antennae STA can support when uncompressed Beamforming feedback required": "1 TX antenna sounding", + "Maximum number of rows of CSI explicit feedback": "1 TX antenna sounding", + "Maximum number of space time streams for which channel dimensions can be simultaneously estimated": "1 space time stream", + "Minimal grouping used for explicit feedback reports": "No grouping supported", + "Receive Null Data packet (NDP)": 0, + "Receive Staggered Sounding": 0, + "Receiver can return explicit CSI feedback": "not supported", + "Receiver can return explicit uncompressed Beamforming Feedback Matrix": "not supported", + "STA can apply TxBF using CSI explicit feedback": 0, + "STA can apply TxBF using compressed beamforming feedback matrix": 0, + "STA can apply TxBF using uncompressed beamforming feedback matrix": 0, + "STA can compress and use compressed Beamforming Feedback Matrix": "not supported", + "Transmit Beamforming": 0, + "Transmit Null Data packet (NDP)": 0, + "Transmit Staggered Sounding": 0 + } + }, + "name": "HT Capabilities", + "type": 45 + }, + { + "content": { + "Extended Capabilities": { + "20/40 BSS Coexistence Management Support": 0, + "AC Station Count": 0, + "BSS Transition": 0, + "Channel Usage": 0, + "Civic Location": 0, + "Collocated Interference Reporting": 0, + "DMS": 0, + "Diagnostics": 0, + "EBR": 0, + "Event": 0, + "Extended Channel Switching": 1, + "FMS": 0, + "Geospatial Location": 0, + "Identifier Location": 0, + "Interworking": 0, + "Location Tracking": 0, + "MSGCF Capability": 0, + "Multicast Diagnostics": 0, + "Multiple BSSID": 0, + "On-demand beacon": 0, + "PSMP Capability": 0, + "Peer U-APSD Buffer STA Support": 0, + "Proxy ARP Service": 1, + "QoS Map": 1, + "QoS Traffic Capability": 0, + "Reject Unadmitted Frame": 0, + "Reserved": 0, + "S-PSMP Support": 0, + "SSID List": 1, + "SSPN Interface": 0, + "Service Interval Granularity": "5 ms", + "TDLS Channel Switching Prohibited": 0, + "TDLS Peer PSM Support": 0, + "TDLS Prohibited": 0, + "TDLS channel switching": 0, + "TDLS support": 0, + "TFS": 0, + "TIM Broadcast": 0, + "Timing Measurement": 0, + "U-APSD Coexistence": 0, + "UTC TSF Offset": 0, + "UTF-8 SSID": 1, + "WAVE indication": 0, + "WNM-Notification": 0, + "WNM-Sleep Mode": 0 + } + }, + "name": "Extended Capabilities", + "type": 127 + }, + { + "content": { + "MCS Set": { + "Rx Bitmask Bits 0-7": "11111010", + "Rx Bitmask Bits 16-23": "00000000", + "Rx Bitmask Bits 24-31": "00000000", + "Rx Bitmask Bits 8-15": "11111111" + }, + "VHT Capabilities Info": { + "Compressed Steering Number of Beamformer Antennas Supported": "4", + "HTC-VHT Capable VHT variant HT Control field": 0, + "MU Beam-formee Capable": 0, + "MU Beam-former Capable": "5", + "Max A-MPDU Length": "unknown", + "Maximum MPDU Length": "11 454", + "Number of Sounding Dimensions": "2", + "Rx Antenna Pattern Consistency": 1, + "Rx LDPC": 1, + "Rx STBC": "1 Spatial Stream Supported", + "SU Beam-formee Capable": 1, + "SU Beam-former Capable": 1, + "Short GI for 160MHz and 80+80MHz": 0, + "Short GI for 80MHz": 1, + "Supported Channel Width Set": "Neither 160MHz nor 80+80 supported", + "Tx Antenna Pattern Consistency": 1, + "Tx STBC": 1, + "VHT Link Adaptation": "No Feedback", + "VHT TXOP PS": 0 + } + }, + "name": "VHT Capabilities Info", + "type": 191 + }, + { + "content": { + "Tx Pwr Info": { + "Local Max Tx Pwr Constraint 20MHz": 42, + "Local Max Tx Pwr Constraint 40MHz": 42, + "Local Max Tx Pwr Constraint 80MHz": 42 + } + }, + "name": "Tx Pwr Info", + "type": 195 + }, + { + "content": { + "Block": "0d 00 08 9a 40 10 04 70 4c 88 1e c1 83 04 01 2c 00 fa ff fa ff 39 1c c7 71 1c 07", + "Extension EID": "23" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Block": "f4 3f 00 81 fc ff", + "Extension EID": "24" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Block": "01 08 a9 ff 2f a9 ff 45 75 ff 65 75 ff", + "Extension EID": "26" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Ac Parameters": { + "ACI / AIFSN Field": [ + { + "ACI": "Best Effort", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 10, + "ECW Min": 4, + "TXOP Limit": 0 + }, + { + "ACI": "Background", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 10, + "ECW Min": 4, + "TXOP Limit": 0 + }, + { + "ACI": "Video", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 4, + "ECW Min": 3, + "TXOP Limit": 94 + }, + { + "ACI": "Voice", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 3, + "ECW Min": 2, + "TXOP Limit": 47 + } + ] + }, + "WME QoS Info": { + "WME QoS Info": { + "AC_BE": 0, + "AC_BK": 0, + "AC_VI": 0, + "AC_VO": 0, + "Max SP Length": "WMM AP may deliver all buffered frames (MSDUs and MMPDUs)" + } + }, + "WME Subtype": "Parameter Element", + "WME Version": 1, + "type": "WMM/WME", + "vendor": "Wi-Fi : WPA / WME" + }, + "name": "Vendor Specific", + "type": 221 + } + ], + "last_seen": 2800, + "signal": 3, + "ssid": "tls_ssid_wpa2_eap_5g", + "tsf": 11150779731, + "vht_oper": "AToA/P8=" + }, + { + "bssid": "06:06:ae:6f:6f:f6", + "capability": 305, + "channel": 52, + "frequency": 5260, + "ht_oper": "NAUAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "ies": [ + { + "content": [ + "6(B)", + "9", + "12(B)", + "18", + "24(B)", + "36", + "48", + "54" + ], + "name": "Supported Rates (Mbps)", + "type": 1 + }, + { + "content": { + "current_channel": 52 + }, + "name": "DS Params", + "type": 3 + }, + { + "content": { + "Bitmap control": { + "Bitmap Offset": 0, + "Multicast": 0, + "Partial Virtual Bitmap": "00" + }, + "DTIM count": 0, + "DTIM period": 2 + }, + "name": "Traffic Indication Map (TIM)", + "type": 5 + }, + { + "content": { + "Code": "CA", + "Environment": "Any", + "constraints": [ + { + "Country Info": { + "First Channel Number": 36, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 8 + } + }, + { + "Country Info": { + "First Channel Number": 100, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 5 + } + }, + { + "Country Info": { + "First Channel Number": 132, + "Maximum Transmit Power Level (in dBm)": 24, + "Number of Channels": 4 + } + }, + { + "Country Info": { + "First Channel Number": 149, + "Maximum Transmit Power Level (in dBm)": 30, + "Number of Channels": 5 + } + } + ] + }, + "name": "country", + "type": 7 + }, + { + "content": { + "Local Power Constraint": 3 + }, + "name": "Local Power Constraint", + "type": 32 + }, + { + "content": { + "Auth Key Management (AKM) List": [ + { + "Auth Key Management (AKM) OUI": "00:0f:ac", + "Auth Key Management (AKM) type": "WPA (SHA256)" + } + ], + "Auth Key Management (AKM) Suite Count": 1, + "Group Cipher Suite OUI": "00:0f:ac", + "Group Cipher Suite type": "AES (CCM)", + "Pairwise Cipher Suite Count": 1, + "Pairwise Cipher Suite List": [ + { + "Group Cipher Suite OUI": "00:0f:ac", + "Group Cipher Suite type": "AES (CCM)" + } + ], + "RSN Capabilities": { + "Management Frame Protection Capable": 1, + "Management Frame Protection Required": 1, + "PeerKey Enabled": 0, + "RSN GTKSA Replay Counter capabilities": "1 replay counter per PTKSA/GTKSA/STAKeySA", + "RSN No Pairwise capabilities": 0, + "RSN PTKSA Replay Counter capabilities": "16 replay counters per PTKSA/GTKSA/STAKeySA", + "RSN Pre-Auth capabilities": 0 + }, + "RSN Version": 1 + }, + "name": "RSN", + "type": 48 + }, + { + "content": { + "802.11e CCA Version": { + "Available Admission Capabilities": 32512, + "Channel Utilization": 0, + "QBSS Version": 2, + "Station Count": 3 + } + }, + "name": "QBSS Load", + "type": 11 + }, + { + "content": { + "Alternate Regulatory Classes": "0", + "Current Regulatory Class": 128 + }, + "name": "Supported Regulatory Classes", + "type": 59 + }, + { + "content": { + "A-MPDU Parameters": { + "MPDU Density": 0, + "Maximum Rx A-MPDU Length": 3 + }, + "Antenna Selection (ASEL) Capabilities": { + "Antenna Indices Feedback": 0, + "Antenna Indices Feedback Based Tx ASEL": 0, + "Antenna Selection Capable": 0, + "Antenna Selection Capable TXCSI": 0, + "Explicit CSI Feedback": 0, + "Rx ASEL": 0, + "Tx Sounding PPDUs": 0 + }, + "HT Capabilities Info": { + "HT Delayed Block ACK": true, + "HT Forty MHz Intolerant": false, + "HT Green Field": 12, + "HT L-SIG TXOP Protection support": false, + "HT LDPC coding capability": true, + "HT Max A-MSDU length": false, + "HT PSMP Support": false, + "HT Rx STBC": 1, + "HT Short GI for 20MHz": true, + "HT Short GI for 40MHz": true, + "HT Support channel width": true, + "HT Tx STBC": true + }, + "HT Extended Capabilities": { + "High Throughput": 0, + "MCS Feedback capability": 0, + "Reverse Direction Responder": 0, + "Time needed to transition between 20MHz and 40MHz": 0, + "Transmitter supports PCO": 0 + }, + "MCS Set": { + "Rx Bitmask Bits 0-7": "11111111", + "Rx Bitmask Bits 16-23": "00000000", + "Rx Bitmask Bits 24-31": "00000000", + "Rx Bitmask Bits 8-15": "11111111" + }, + "Transmit Beam Forming (TxBF) Capabilities": { + "Calibration": "incapable", + "Implicit TxBF capable": 0, + "Max antennae STA can support when CSI feedback required": "1 TX antenna sounding", + "Max antennae STA can support when compressed Beamforming feedback required": "1 TX antenna sounding", + "Max antennae STA can support when uncompressed Beamforming feedback required": "1 TX antenna sounding", + "Maximum number of rows of CSI explicit feedback": "1 TX antenna sounding", + "Maximum number of space time streams for which channel dimensions can be simultaneously estimated": "1 space time stream", + "Minimal grouping used for explicit feedback reports": "No grouping supported", + "Receive Null Data packet (NDP)": 0, + "Receive Staggered Sounding": 0, + "Receiver can return explicit CSI feedback": "not supported", + "Receiver can return explicit uncompressed Beamforming Feedback Matrix": "not supported", + "STA can apply TxBF using CSI explicit feedback": 0, + "STA can apply TxBF using compressed beamforming feedback matrix": 0, + "STA can apply TxBF using uncompressed beamforming feedback matrix": 0, + "STA can compress and use compressed Beamforming Feedback Matrix": "not supported", + "Transmit Beamforming": 0, + "Transmit Null Data packet (NDP)": 0, + "Transmit Staggered Sounding": 0 + } + }, + "name": "HT Capabilities", + "type": 45 + }, + { + "content": { + "Extended Capabilities": { + "20/40 BSS Coexistence Management Support": 0, + "AC Station Count": 0, + "BSS Transition": 0, + "Channel Usage": 0, + "Civic Location": 0, + "Collocated Interference Reporting": 0, + "DMS": 0, + "Diagnostics": 0, + "EBR": 0, + "Event": 0, + "Extended Channel Switching": 1, + "FMS": 0, + "Geospatial Location": 0, + "Identifier Location": 0, + "Interworking": 0, + "Location Tracking": 0, + "MSGCF Capability": 0, + "Multicast Diagnostics": 0, + "Multiple BSSID": 0, + "On-demand beacon": 0, + "PSMP Capability": 0, + "Peer U-APSD Buffer STA Support": 0, + "Proxy ARP Service": 1, + "QoS Map": 1, + "QoS Traffic Capability": 0, + "Reject Unadmitted Frame": 0, + "Reserved": 0, + "S-PSMP Support": 0, + "SSID List": 1, + "SSPN Interface": 0, + "Service Interval Granularity": "5 ms", + "TDLS Channel Switching Prohibited": 0, + "TDLS Peer PSM Support": 0, + "TDLS Prohibited": 0, + "TDLS channel switching": 0, + "TDLS support": 0, + "TFS": 0, + "TIM Broadcast": 0, + "Timing Measurement": 0, + "U-APSD Coexistence": 0, + "UTC TSF Offset": 0, + "UTF-8 SSID": 1, + "WAVE indication": 0, + "WNM-Notification": 0, + "WNM-Sleep Mode": 0 + } + }, + "name": "Extended Capabilities", + "type": 127 + }, + { + "content": { + "MCS Set": { + "Rx Bitmask Bits 0-7": "11111010", + "Rx Bitmask Bits 16-23": "00000000", + "Rx Bitmask Bits 24-31": "00000000", + "Rx Bitmask Bits 8-15": "11111111" + }, + "VHT Capabilities Info": { + "Compressed Steering Number of Beamformer Antennas Supported": "4", + "HTC-VHT Capable VHT variant HT Control field": 0, + "MU Beam-formee Capable": 0, + "MU Beam-former Capable": "5", + "Max A-MPDU Length": "unknown", + "Maximum MPDU Length": "11 454", + "Number of Sounding Dimensions": "2", + "Rx Antenna Pattern Consistency": 1, + "Rx LDPC": 1, + "Rx STBC": "1 Spatial Stream Supported", + "SU Beam-formee Capable": 1, + "SU Beam-former Capable": 1, + "Short GI for 160MHz and 80+80MHz": 0, + "Short GI for 80MHz": 1, + "Supported Channel Width Set": "Neither 160MHz nor 80+80 supported", + "Tx Antenna Pattern Consistency": 1, + "Tx STBC": 1, + "VHT Link Adaptation": "No Feedback", + "VHT TXOP PS": 0 + } + }, + "name": "VHT Capabilities Info", + "type": 191 + }, + { + "content": { + "Tx Pwr Info": { + "Local Max Tx Pwr Constraint 20MHz": 42, + "Local Max Tx Pwr Constraint 40MHz": 42, + "Local Max Tx Pwr Constraint 80MHz": 42 + } + }, + "name": "Tx Pwr Info", + "type": 195 + }, + { + "content": { + "Block": "0d 00 08 9a 40 10 04 70 4c 88 1e c1 83 04 01 2c 00 fa ff fa ff 39 1c c7 71 1c 07", + "Extension EID": "23" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Block": "f4 3f 00 81 fc ff", + "Extension EID": "24" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Block": "01 08 a9 ff 2f a9 ff 45 75 ff 65 75 ff", + "Extension EID": "26" + }, + "name": "EI Extensions", + "type": 255 + }, + { + "content": { + "Ac Parameters": { + "ACI / AIFSN Field": [ + { + "ACI": "Best Effort", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 10, + "ECW Min": 4, + "TXOP Limit": 0 + }, + { + "ACI": "Background", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 10, + "ECW Min": 4, + "TXOP Limit": 0 + }, + { + "ACI": "Video", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 4, + "ECW Min": 3, + "TXOP Limit": 94 + }, + { + "ACI": "Voice", + "AIFSN": 0, + "Admission Control Mandatory": 0, + "ECW Max": 3, + "ECW Min": 2, + "TXOP Limit": 47 + } + ] + }, + "WME QoS Info": { + "WME QoS Info": { + "AC_BE": 0, + "AC_BK": 0, + "AC_VI": 0, + "AC_VO": 0, + "Max SP Length": "WMM AP may deliver all buffered frames (MSDUs and MMPDUs)" + } + }, + "WME Subtype": "Parameter Element", + "WME Version": 1, + "type": "WMM/WME", + "vendor": "Wi-Fi : WPA / WME" + }, + "name": "Vendor Specific", + "type": 221 + } + ], + "last_seen": 2760, + "signal": 3, + "ssid": "tls_ssid_wpa3_eap_5g", + "tsf": 11150813864, + "vht_oper": "AToA/P8=" + } + ], + "text": "Success" + }, + "uuid": 1657164026 + } +} +``` + diff --git a/device-feature-configuration-examples/basic-device-provisioning/README.md b/device-feature-configuration-examples/basic-device-provisioning/README.md new file mode 100644 index 0000000..8c93f9a --- /dev/null +++ b/device-feature-configuration-examples/basic-device-provisioning/README.md @@ -0,0 +1,27 @@ +--- +description: OpenWiFi 2.0 +--- + +# Basic Device Provisioning + +OpenWiFi device features are configurable through understanding the uCentral device data model. + +For integrators of commercial controllers, these feature examples may help guide development of device provisioning within a partner controller products. + +Experimentation with device features often occurs initially through static configuration as JSON document sent to a device using the OpenWiFi Gateway. + +Commercial products with OpenWiFi device provisioning will be using the northbound API to create, update, delete per device configurations. These APIs are then inter-worked southbound via the OpenWiFi Gateway to devices. + +Some of the available device features are exposed in this same manner using the OpenWiFi Provisioning service. This provisioning service offers an additional way for commercial partners to consume OpenWiFi and integrate a controller or back office environment that may require device provisioning when that functionality is not present as part of a controller or other commercial product. + +The following pages guide the user to understanding each of these features individually including example configuration information. + +#### Basic Examples + +One of the benefits of the new data plane in OpenWiFi 2.0 is the flexibility of physical port to logical forwarding that is easily conveyed through configuration structures. + +New protocol support is both easily added to the system as well as associated with interfaces by their role in the device. + +The following sections offer feature configuration examples. + +For complete reference to the device data model please refer [here.](../../sdk/provisioning/data-model-introduction.md) diff --git a/device-feature-configuration-examples/basic-device-provisioning/bridge-mode-ssid.md b/device-feature-configuration-examples/basic-device-provisioning/bridge-mode-ssid.md new file mode 100644 index 0000000..ade17cf --- /dev/null +++ b/device-feature-configuration-examples/basic-device-provisioning/bridge-mode-ssid.md @@ -0,0 +1,143 @@ +--- +description: OpenWiFi 2.0 +--- + +# Bridge Mode SSID + +Creating logical bridges may be done through association to named "interfaces". To associate a logical SSID interface directly to the WAN, place SSID configuration within the interface have a "role" of upstream. + +{% tabs %} +{% tab title="SSID to WAN" %} +``` + "interfaces": [ + { + "name": "WAN", + "role": "upstream", + "services": [ "lldp" ], + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + }, + "ssids": [ + { + "name": "OpenWifi", + "wifi-bands": [ + "2G", "5G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWifi", + "ieee80211w": "optional" + } + } + ] +``` +{% endtab %} + +{% tab title="Dual SSID to WAN" %} +``` +"interfaces": [ + { + "name": "WAN", + "role": "upstream", + "services": [ "lldp" ], + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + }, + "ssids": [ + { + "name": "OpenWifi_2GHz", + "wifi-bands": [ + "2G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWifi", + "ieee80211w": "optional" + } + }, + { + "name": "OpenWifi_5GHz", + "wifi-bands": [ + "5G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWifi", + "ieee80211w": "optional" + } + } + ] +``` +{% endtab %} + +{% tab title="Dual SSID Bridge Rate-Limit to WAN" %} +``` + "interfaces": [ + { + "name": "WAN", + "role": "upstream", + "services": [ "lldp" ], + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + }, + "ssids": [ + { + "name": "OpenWifi_2GHz", + "wifi-bands": [ + "2G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWifi", + "ieee80211w": "optional" + }, + "rate-limit": { + "ingress-rate": 100, + "egress-rate": 100 + } + }, + { + "name": "OpenWifi_5GHz", + "wifi-bands": [ + "5G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWifi", + "ieee80211w": "optional" + }, + "rate-limit": { + "ingress-rate": 250, + "egress-rate": 250 + } + } + ] +``` +{% endtab %} +{% endtabs %} diff --git a/device-feature-configuration-examples/basic-device-provisioning/multi-vlan-ssid.md b/device-feature-configuration-examples/basic-device-provisioning/multi-vlan-ssid.md new file mode 100644 index 0000000..e794446 --- /dev/null +++ b/device-feature-configuration-examples/basic-device-provisioning/multi-vlan-ssid.md @@ -0,0 +1,137 @@ +--- +description: OpenWiFi 2.0 +--- + +# Multi-VLAN SSID + +The most common use case for VLANs and Wi-Fi is likely the service provider, venue, enterprise where Wi-Fi traffic is not subject to address translation. This is the example that will be shown, however it is entirely possible to create multiple downstream VLANs with SSIDs as well. Simply replace the logic of upstream to downstream where desired. + +{% tabs %} +{% tab title="Single SSID VLAN" %} +``` + "interfaces": [ + { + "name": "WAN", + "role": "upstream", + "services": [ "lldp", "dhcp-snooping" ], + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + } + }, + { + "name": "WAN100", + "role": "upstream", + "vlan": { + "id": 100 + }, + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ssids": [ + { + "name": "VLAN 100 Wi-Fi", + "wifi-bands": [ + "2G", "5G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWifi", + "ieee80211w": "optional" + } + } + ] + }, +``` +{% endtab %} + +{% tab title="Dual SSID - Dual VLAN" %} +``` + "interfaces": [ + { + "name": "WAN", + "role": "upstream", + "services": [ "lldp", "dhcp-snooping" ], + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + } + }, + { + "name": "WAN100", + "role": "upstream", + "vlan": { + "id": 100 + }, + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ssids": [ + { + "name": "VLAN 100 Wi-Fi", + "wifi-bands": [ + "2G", "5G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWifi", + "ieee80211w": "optional" + } + } + ] + }, + { + "name": "WAN200", + "role": "upstream", + "vlan": { + "id": 200 + }, + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ssids": [ + { + "name": "VLAN 200 Wi-Fi", + "wifi-bands": [ + "5G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWifi", + "ieee80211w": "optional" + } + } + ] + }, +``` +{% endtab %} +{% endtabs %} + +In all cases the WAN port without VLAN id is using DHCP to obtain a management IP address. Each additional "upstream" role interface with an SSID associated have no IP configuration. diff --git a/device-feature-configuration-examples/basic-device-provisioning/nat-gateway-mode-ssid.md b/device-feature-configuration-examples/basic-device-provisioning/nat-gateway-mode-ssid.md new file mode 100644 index 0000000..6231e73 --- /dev/null +++ b/device-feature-configuration-examples/basic-device-provisioning/nat-gateway-mode-ssid.md @@ -0,0 +1,84 @@ +--- +description: OpenWiFi 2.0 +--- + +# NAT Gateway Mode SSID + +Creating a NAT Gateway is easily done via association to an interface having a role of "downstream". + +{% tabs %} +{% tab title="Dual SSID NAT" %} +``` + "interfaces": [ + { + "name": "WAN", + "role": "upstream", + "services": [ "lldp" ], + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + } + }, + { + "name": "LAN", + "role": "downstream", + "services": [ "ssh", "lldp" ], + "ethernet": [ + { + "select-ports": [ + "LAN*" + ] + } + ], + "ipv4": { + "addressing": "static", + "subnet": "192.168.1.1/24", + "dhcp": { + "lease-first": 10, + "lease-count": 100, + "lease-time": "6h" + } + }, + "ssids": [ + { + "name": "OpenWifi_2GHz", + "role": "downstream", + "wifi-bands": [ + "2G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWifi", + "ieee80211w": "optional" + } + }, + { + "name": "OpenWifi_5GHz", + "role": "downstream", + "wifi-bands": [ + "5G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWifi", + "ieee80211w": "optional" + } + } + ] + + } +``` +{% endtab %} +{% endtabs %} + +Based on the above Dual SSID NAT configuration, a unique 2GHz and 5GHz SSID are created and logically bound to the same NAT LAN side network. + +The NAT service is inherited by the downstream role with DHCP addressing defined according to the range set within the downstream "ipv4" configuration. diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/README.md b/device-feature-configuration-examples/device-feature-configuration-examples/README.md new file mode 100644 index 0000000..7a5241c --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/README.md @@ -0,0 +1,19 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Advanced Device Feature Configuration Examples + +OpenWiFi device features are configurable through understanding the uCentral device data model. + +For integrators of commercial controllers, these feature examples may help guide development of device provisioning within a partner controller products. + +Experimentation with device features often occurs initially through static configuration as JSON document sent to a device using the OpenWiFi Gateway. + +Commercial products with OpenWiFi device provisioning will be using the northbound API to create, update, delete per device configurations. These APIs are then inter-worked southbound via the OpenWiFi Gateway to devices. + +Some of the available device features are exposed in this same manner using the OpenWiFi Provisioning service. This provisioning service offers an additional way for commercial partners to consume OpenWiFi and integrate a controller or back office environment that may require device provisioning when that functionality is not present as part of a controller or other commercial product. + +The following pages guide the user to understanding each of these features individually including example configuration information. + +For complete reference to the device data model please refer [here.](../../sdk/provisioning/data-model-introduction.md) diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/captive-portal/README.md b/device-feature-configuration-examples/device-feature-configuration-examples/captive-portal/README.md new file mode 100644 index 0000000..1ec7580 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/captive-portal/README.md @@ -0,0 +1,56 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Captive Portal + +OpenWiFi supports multiple models for Captive Portal. A built-in captive portal is described below. With multiple overlay tunnel services such as GRE and L2TP in addition to VLAN features, OpenWiFi is also easily deployed with any number of Captive Portal appliance solutions in either in-band or out-of-band style deployments. + +## Local Captive Portal + +Creating a local captive portal involves associating the "captive" service with an interface. In the example below, "captive" is enabled on a downstream role interface. Any associated SSID on LAN side of this Access Point will be subject to configuration of the local captive portal. This would also apply to LAN interfaces if also associated with "captive". + +``` + { + "name": "captive", + "role": "downstream", + "captive": { + "max-clients": 32, + "gateway-name": "Lobby Wi-Fi Welcome", + "upload-rate": 10, + "download-rate": 20, + "upload-quota": 300, + "download-quota": 300 + }, + "ipv4": { + "addressing": "static", + "subnet": "192.168.2.1/24", + "dhcp": { + "lease-first": 10, + "lease-count": 100, + "lease-time": "6h" + } + }, + "ssids": [ + { + "name": "Office Lobby Wi-Fi", + "wifi-bands": [ + "5G", + "2G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "none", + "ieee80211w": "optional" + }, + "roaming": { + "message-exchange": "ds", + "generate-psk": true + } + } + ] + } + ], +``` + +Local captive portal will redirect to a default landing page and display the name as configured in "gateway-name". Per associated user bandwidth and usage quota limits and total association limits may all be defined. diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/captive-portal/external-captive-portal.md b/device-feature-configuration-examples/device-feature-configuration-examples/captive-portal/external-captive-portal.md new file mode 100644 index 0000000..938b63e --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/captive-portal/external-captive-portal.md @@ -0,0 +1,107 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# External Captive Portal + +When an external access controller, such as a captive portal appliance or a Universal Access Method (UAM) redirector is required to handle subscriber login, OpenWiFi optionally supports builds that include use of CoovaChili. This would be found in build profile chilli-redirect.yml. + +To configure a CoovaChilli service, OpenWiFi supports the `"third-party"` schema definition. + +Through the use of third-party, many configurations are possible, for external captive portal, third-party will process a services lookup of `"chilli-redirect"` applied to an interface. + +Within `"third-party"` will be the necessary CoovaChilli configuration parameters. + +``` +"third-party": { + "chilli-redirect": { + "uamport": 3990, + "radiusauthport": 1812, + "radiusacctport": 1813, + "radiusserver1": "radiusServerIP", + "radiusserver2": "radiusServerIP", + "radiusnasid": "nasID", + "uamallowed": "allowed.example.com,10.0.0.1,192.168.10.1", + "uamdomain": "exampleUAMdomain.com,otherExampleUAMdomain.com", + "defidletimeout": 900, + "definteriminterval": 600, + "acctupdate": 1, + "uamserver": "https://portal.example.com/portal/default/index.php?n=NAME&c=3&l=181", + "radiussecret": "radiusSecret", + "nasmac": "00:01:02:03:04:AA" + } + } +``` + +## NAT Mode + +Associate to an interface: + +``` +{ + "name": "LAN", + "role": "downstream", + "services": [ "ssh", "chilli-redirect" ], + "ethernet": [ + { + "select-ports": [ + "LAN*" + ] + } + ], + "ipv4": { + "addressing": "static", + "subnet": "192.168.1.1/24", + "dhcp": { + "lease-first": 10, + "lease-count": 100, + "lease-time": "6h" + } + }, + "ssids": [ + { + "name": "Hotspot SSID Name", + "wifi-bands": [ + "2G", "5G" + ], + "bss-mode": "ap" + } + ] + } +``` + +## Bridge Mode + +In the above example, captive portal redirection occurs via a NAT interface on LAN side or `"downstream"` role. + +When a direct to WAN presentation, or bridge mode operation is desired, associate the service to the `"upstream"` interface. + +Associate to an interface: + +``` +"interfaces": [ + { + "name": "WAN", + "role": "upstream", + "services": [ "chilli-redirect" ], + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + }, + "ssids": [ + { + "name": "Hotspot SSID Name", + "wifi-bands": [ + "2G", "5G" + ], + "bss-mode": "ap" + } + ] + }, +``` diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/dhcp-relay.md b/device-feature-configuration-examples/device-feature-configuration-examples/dhcp-relay.md new file mode 100644 index 0000000..05de5b1 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/dhcp-relay.md @@ -0,0 +1,59 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# DHCP Relay + +When operators of enterprise or service provider networks seek to influence or control the allocation of dynamically assigned IP address, typically the network edge has been provisioned to encode information in DHCP Relay packets that help identify the access device through which a subscriber is attached, the logical sub-interface of that network edge or the subscriber directly. + +TIP OpenWiFi supports DHCP Relay with encoding of client Circuit-Id information containing any of: + +* Interface +* VLAN-Id +* SSID +* Encryption Mode +* Device Name +* Device Model +* Device Location +* Access Point MAC Address +* Access Point MAC in Hex +* Client MAC Address +* Client MAC Address in Hex + +TIP OpenWiFi Relay-Agent remote-id may be configured to contain any of the following: + +* VLAN-Id +* SSID +* AP-MAC +* AP-MAC-Hex +* Client MAC +* Client MAC Hex + +The remote-id originates from a configured IPv4 interface address. + +``` + { + "name": "LAN", + "role": "downstream", + "services": [ "ssh", "lldp" ], + "ethernet": [ + { + "select-ports": [ + "LAN*" + ] + } + ], + "ipv4": { + "addressing": "static", + "subnet": "192.168.1.1/24", + "dhcp": { + "relay-server" : "192.168.100.20", + "circuit-id-format": "{Interface}:{SSID}:{AP-MAC}:{Location}", + "remote-id-format": "{AP-MAC}:{SSID}" + } + } + } + ] +``` + +In the above example, when the IPv4 downstream interface 192.168.1.1 has DHCP enabled for `relay-server` a DHCP relay process associates to the IP interface of the subnet. When DHCP DISCOVER packets arrive as broadcasts, they will be copied to a unicast packet from the `192.168.1.1` interface as the `relay-id` source address and unicast forwarded to the defined `relay-server` address. Additional parameters are encoded for inspection at the DHCP server as present in `circuit-id`-format and `remote-id`-format options. diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/dynamic-air-time-fairness.md b/device-feature-configuration-examples/device-feature-configuration-examples/dynamic-air-time-fairness.md new file mode 100644 index 0000000..3a5a9f7 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/dynamic-air-time-fairness.md @@ -0,0 +1,52 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Dynamic Air Time Fairness + +Complimenting enterprise QoS in OpenWiFi is support for Dynamic Air Time Fairness. + +Air Time Fairness (ATF) governs the Wireless Multimedia (WMM) operations on the air interface with influence of the scheduler based on the QoS classification that has been applied to the flow. + +The Distributed Coordination Function (DCF) which is the underlying Media Access Control system to Wi-Fi is generally governed by equality rules at the air interface, every UE is equal. + +Traffic handling in Wi-Fi is a balance of application of QoS marked flows to scheduling of contention access in certain queueing terms to the air interface medium. + +OpenWiFi WMM Supports the following class selector profiles: + +* Enterprise +* RFC8325 - default +* 3GPP + + + +Air Time Fairness Example: + +``` +"services": { + "airtime-fairness": { + "voice-weight": 4, + "packet-threshold": 100, + "bulk-threshold": 50, + "priority-threshold": 30, + "weight-normal": 256, + "weight-priority": 384, + "weight-bulk": 128 + } + } +``` + +Airtime weights have a valid range of 0 - 511. Airtime Fairness works using sliding averages of total packets per second to approximate influence to the scheduler. + +Voice weight operates as a multiplier of traffic marked CS5 / UP5 which is equivalent to DSCP EF. When voice-weight is set to 4 this directs the scheduler to assume it should set aside four (4) times the average bandwidth granted for this flow in order to move it through the air interface as quickly as possible. + +Packet threshold will reclassify every number of packets from the UE station ( in the example every 100 ). + +When arriving traffic for the UE are classified as bulk, and in the above example over 50% of total arriving traffic appear with the same QoS classification the UE airtime priority will fall into bulk-threshold. + +When more than 30% of arriving traffic for the UE are classified as CS4 or equivalent to AC\_VI / AF3x realtime interactive, the UE airtime priority will rise to priority airtime. + + + + + diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/dynamic-air-time-policy.md b/device-feature-configuration-examples/device-feature-configuration-examples/dynamic-air-time-policy.md new file mode 100644 index 0000000..857dc89 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/dynamic-air-time-policy.md @@ -0,0 +1,43 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Dynamic Air-Time Policy + +{% hint style="info" %} +This feature has been deprecated in OpenWiFi 2.6 in order to support both Layer 3 and Layer 2 classification topologies through QoS and Dynamic Airtime Fairness. +{% endhint %} + + + +Dynamic Air-Time Policy is a service to influence underlying co-ordination function of the Wi-Fi MAC domain per associated UE in terms of priority to use the air interface. + +It is possible to govern certain application use cases such as streaming media or real time communications based on the resolution of those services through DNS. + +This results in the UE, by its IP address having matched a specific fully qualified domain name or a wildcard therein, to having its air-time weighted priority to the value set in the weight parameter. + +``` + "services": { + "airtime-policies": { + "dns-match": ["*.example.com", "host.example2.com" ], + "dns-weight": 256 + } + } +``` + +{% hint style="info" %} +Note: In release 2.1, airtime-policies must be applied to SSIDs in a NAT configuration. Bridge / VLAN mode SSIDs with airtime-policies will be updated in a future release +{% endhint %} + +## Possible Uses + +Any application a user may commonly use the OpenWiFi administrator seeks to prioritize air-time for may be triggered via the airtime-policies. + +For example: + +| Service | FQDN / URL | +| -------- | ---------------------------------------------------------- | +| MS Teams | _\*.lync.com, \*_.teams.microsoft.com, teams.microsoft.com | +| Zoom | \*.zoom.us | + +Any number of services may interest the administrator for airtime-policies. Simply determine the FQDN or wildcard FQDN applicable and update the OpenWiFi device configuration. diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/gre.md b/device-feature-configuration-examples/device-feature-configuration-examples/gre.md new file mode 100644 index 0000000..298f22c --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/gre.md @@ -0,0 +1,63 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# GRE + +OpenWiFi 2.0 supports Generic Routing Encapsulation as an available "tunnel" protocol type. + +This makes it possible to configure GRE for multiple types of deployments as any interface may be encapsulated by the "tunnel" parameter. + +For example, to send all content of a specific SSID over an GRE tunnel, the following configuration would apply. + +``` + "interfaces": [ + { + "name": "WAN", + "role": "upstream", + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + } + }, + { + "name": "GRE", + "role": "upstream", + "vlan": { + "id": 20 + }, + "tunnel": { + "proto": "gre", + "peer-address": "far end IP address", + }, + "ssids": [ + { + "name": "Tunneled SSID via GRE from VLAN 20 Interface", + "wifi-bands": [ + "2G", "5G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "none", + "ieee80211w": "optional" + }, + "rate-limit": { + "ingress-rate": 100, + "egress-rate": 100 + }, + "roaming": { + "message-exchange": "ds", + "generate-psk": true + } + } + ] + }, +``` + +In the above example, the WAN untagged port will request DHCP in addition to present a VLAN interface with id 20 that both initiates the GRE tunnel as well as passes SSID traffic over that tunnel. Optionally the GRE tunnel itself may also carry a VLAN encapsulated payload. In the above example a WAN presentation of VLAN interface 20 has GRE tunnel. Within the GRE tunnel on WAN interface of VLAN 20 is a GRE payload with VLAN 30 in the payload header. diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/l2tp.md b/device-feature-configuration-examples/device-feature-configuration-examples/l2tp.md new file mode 100644 index 0000000..13201a2 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/l2tp.md @@ -0,0 +1,64 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# L2TP + +Layer 2 Tunneling Protocol may be associated to any interface using the "tunnel" configuration option. + +This makes it possible to configure L2TP for multiple types of deployments as any interface may be encapsulated by the "tunnel" parameter. + +For example, to send all content of a specific SSID over an L2TP tunnel, the following configuration would apply. + +``` + { + "name": "LAN", + "role": "downstream", + "services": [ "ssh" ], + "ethernet": [ + { + "select-ports": [ + "LAN*" + ] + } + ], + "ipv4": { + "addressing": "static", + "subnet": "192.168.1.1/24", + "dhcp": { + "lease-first": 10, + "lease-count": 100, + "lease-time": "6h" + } + } + }, + { + "name": "L2TP", + "role": "downstream", + "tunnel": { + "proto": "l2tp", + "server": " far end IP address ", + "user-name": "secret-l2tp-username", + "password": "secrectPassword" + }, + "ipv4": { + "addressing": "static", + "subnet": "192.168.10.1/24", + "dhcp": { + "lease-first": 10, + "lease-count": 100, + "lease-time": "6h" + } + }, + "ssids": [ + { + "name": "Tunneled SSID", + "wifi-bands": [ + "5G", "2G" + ], + "bss-mode": "ap" + } + ] + } + ], +``` diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/mesh.md b/device-feature-configuration-examples/device-feature-configuration-examples/mesh.md new file mode 100644 index 0000000..09e2549 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/mesh.md @@ -0,0 +1,80 @@ +--- +description: OpenWiFi 2.0 +--- + +# Mesh + +OpenWiFi Mesh has been designed to eliminate configuration complexity while also remaining capable of advanced topology designs including Multi-Gateway, Multi-SSID, VLAN, and Zero Touch Mesh onboarding. + +The physical wired interface(s) to participate in the mesh topology egress are defined with the protocol "mesh". + +The logical wireless interface(s) to participate in mesh topology are defined by their bss-mode set to "mesh". + +{% tabs %} +{% tab title="Basic Mesh" %} +``` + "interfaces": [ + { + "name": "WAN", + "role": "upstream", + "tunnel": { + "proto": "mesh" + }, + "services": [ "lldp" ], + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + }, + "ssids": [ + { + "name": "transit", + "wifi-bands": [ + "5G" + ], + "bss-mode": "mesh", + "encryption": { + "proto": "psk2", + "key": "meshpassword", + "ieee80211w": "optional" + } + }, + { + "name": "2GHz Clients", + "wifi-bands": [ + "2G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWiFi", + "ieee80211w": "optional" + } + }, + { + "name": "5GHz Clients", + "wifi-bands": [ + "5G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWiFi", + "ieee80211w": "optional" + } + + } + ] + }, +``` +{% endtab %} +{% endtabs %} + +In this basic mesh, dual SSIDs are configured for clients while an SSID for mesh transit is configured for IEEE802.11s client associations. Additional mesh clients simply use the same approach, no other configuration is required for the client to participate in this mesh. + +Advanced examples with VLANs and roaming are all possible by adding additional configuration steps. diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/metrics.md b/device-feature-configuration-examples/device-feature-configuration-examples/metrics.md new file mode 100644 index 0000000..b8fd78a --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/metrics.md @@ -0,0 +1,74 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Metrics + +## Metrics + +Several metrics are reported during intervals to the OpenWiFi Gateway. In general metrics contain traffic counters, neighbor tables, discovered clients. + +Each OpenWiFi device is capable of sending statistics on SSID, LLDP, and associated Clients learned by the device. + +Additionally, OpenWiFi devices expose all 802.11 management data within wifi-frames and to assist network troubleshooting and client fingerprinting solutions OpenWiFi provides dhcp-snooping for all possible client exchanges over DHCP and DHCPv6. + +``` + "metrics": { + "statistics": { + "interval": 60, + "types": [ "ssids", "lldp", "clients" ] + }, + "health": { + "interval": 300 + }, + "wifi-frames": { + "filters": [ "probe", + "auth", + "assoc", + "disassoc", + "deauth", + "local-deauth", + "inactive-deauth", + "key-mismatch", + "beacon-report", + "radar-detected"] + }, + "dhcp-snooping": { + "filters": [ "ack", + "discover", + "offer", + "request", + "solicit", + "reply", + "renew" ] + } +``` + +The metrics data is sent to OpenWiFi Gateway at the intervals set where configurable. + +Metrics must be associated with the interfaces they are to report on. For example, to send DHCP data from LAN to OpenWiFi Gateway, the following configuration would apply. + +``` + { + "name": "LAN", + "role": "downstream", + "services": [ "ssh", "lldp", "dhcp-snooping" ], + "ethernet": [ + { + "select-ports": [ + "LAN*" + ] + } + ], + "ipv4": { + "addressing": "static", + "subnet": "192.168.1.1/24", + "dhcp": { + "lease-first": 10, + "lease-count": 100, + "lease-time": "6h" + } + } + } + ], +``` diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/multi-psk-mdu-multiple-shared-key.md b/device-feature-configuration-examples/device-feature-configuration-examples/multi-psk-mdu-multiple-shared-key.md new file mode 100644 index 0000000..71ffe84 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/multi-psk-mdu-multiple-shared-key.md @@ -0,0 +1,45 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Multi-PSK (MDU Shared Key) + +Multiple Pre Shared Key is a popular configuration option in Multi Dwelling Unit, dormitory or similar environment where it is costly to implement complex 802.1x security however that same level of per-client security is highly desired. + +A SSID when configured for multi-psk can have multiple PSK/VID mappings. Each one of them can be bound to a specific MAC or be a wildcard. + +``` + "ssids": [ + { + "name": "MDU Wi-Fi", + "wifi-bands": [ + "5G", + "2G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "ieee80211w": "optional", + "key": "OpenWifi" + }, + "multi-psk": [ + { + "key": "akey", + "vlan-id": 100 + }, + { + "key": "bkey" + "vlan-id": 200 + } + ], + "roaming": { + "message-exchange": "ds", + "generate-psk": true + } + } + ] +``` + +{% hint style="info" %} +Note: M-PSK passwords must be unique per `vlan-id` as the device will attempt to match security key to assigned virtual lan. In the above example, a password of `OpenWifi` will match the untagged interface of the SSID and unique password of `"akey"` will match client(s) to virtual lan 100. +{% endhint %} diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/README.md b/device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/README.md new file mode 100644 index 0000000..8fa152e --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/README.md @@ -0,0 +1,19 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Passpoint® + +Passpoint® brings seamless, automatic and secure Wi-Fi connectivity using either pre-provisioned credentials or the SIM card in a mobile device. Passpoint provides simple, fast online sign-up and provisioning that is only required upon a user’s first visit to a Passpoint network. Once a Passpoint enabled device contains the Wi-Fi AP or network credentials, it will discover and securely connect when the user is nearby—without requiring additional user action. This makes staying connected while mobile infinitely easier, and because Passpoint employs enterprise-level security, users can feel confident their data is better protected. + +Passpoint® also delivers more value to carriers, service providers, and IT managers of enterprise networks, enabling: + +* Mobile data offload +* Wi-Fi networks for + * Hospitality, venues and enterprise + * Streamlined, enterprise-class device provisioning and credential management for enterprise and other private networks +* Wi-Fi–based services such as Wi-Fi calling, and collaboration tools +* Wi-Fi roaming agreements across carriers and service providers +* Opportunities to engage users and extract additional value from the network + +Passpoint® is already supported by most enterprise-class APs on the market today, and natively supported by major mobile operating systems including Android, iOS, macOS, and Windows 10. With active support from a wide ecosystem of device manufacturers, mobile operators, and service providers, Passpoint® benefits both users and Wi-Fi network providers diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/advertising-services.md b/device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/advertising-services.md new file mode 100644 index 0000000..7291f26 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/advertising-services.md @@ -0,0 +1,19 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Advertising Services + +Passpoint® requires ANQP to supply three information elements from the Access Point. + +## PLMN-Id + +Public Land Mobile Network Id is defined by 3GPP and comprised of two, three digit numbers to uniquely identify the Mobile Network Operator (MNO). + +## Realm + +A Fully Qualified Domain Name (FQDN) is a realm representing the service provider of the Wi-Fi service. Non MNO operators are an example of 'realm-based' service advertisements. Examples include Cable MSOs, Enterprises or other on MNO providers. Authentication methods used with realm-based configuration are EAP-TLS and EAP-TTLS. + +## OI / RCOI + +Organization Id or as defined by Wireless Broadband Alliance, Roaming Consortium Organization Id indicate the federated identity capable of authentication. Examples would be OpenRoaming, Eduroam and follow the Passpoint® EAP authentication methods. diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/configuration-introduction.md b/device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/configuration-introduction.md new file mode 100644 index 0000000..f9a08a8 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/configuration-introduction.md @@ -0,0 +1,22 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Configuration Introduction + +TIP OpenWiFi devices implement support for both the air interface and systems interfaces necessary to support Passpoint® Release 2 and above. Once also termed Hotspot 2.0, IEEE 802.11u specified added air interface fields exposing Access Network Query Protocol interactions for clients to discovery Access Point capabilities. + +Wi-Fi Alliance expanded ANQP to include Online Signup (OSU) concepts to leverage seamless onboarding and client security for Passpoint® networks. Following on from these efforts, Wireless Broadband Alliance has provided the necessary system interfaces for identity, security, mobile offload within a common federated operator solution known as OpenRoaming. + +TIP OpenWiFi enables operators to deploy the full range of Passpoint® and OpenRoaming solutions. + +| Term | Description | +| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Operator |

Wi-Fi Infrastructure Operator

Access Network Provider (ANP) as defined by OpenRoaming

| +| Venue | Deployed location of Wi-Fi service | +| Identity Provider |

Subscriber authenticating service provider

Home Service Provider (HSP) as defined by OpenRoaming

| +| Roaming Exchange | Operator and Identity Provider Authentication, Authorization, Accounting | +| ANQP |

Access Network Query Protocol contains:

  • Domain
  • Venue Name
  • Venue Info
  • Operator Friendly Name
  • IP Type
  • WAN Metric
  • Connection Capability
  • Operating Class
  • Authentication Type
  • Service Providers List
| +| GAS |

Generic Advertisement Layer 2 Service for client query

  • Client query returns:

    • Organization Identifier / Service Provider Identity
    • Domain
    • Authentication
    • Roaming Consortium List
    • Network Access Identifier Realm (NAI)
    • 3GPP Network Data
| +| OSU |

Online Signup - Advertised over ANQP contains:

  • OSU SSID
  • OSU URI
  • OSU Method
  • OSU Available Icons
  • OSU ESS (OSEN) SSID
  • OSU Description
| +| OSEN | OSU Server Authenticated Layer 2 Encryption Network | diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/passpoint-r-configuration.md b/device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/passpoint-r-configuration.md new file mode 100644 index 0000000..a8b5b34 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/passpoint-r1/passpoint-r-configuration.md @@ -0,0 +1,165 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Passpoint® Configuration + +It is possible to configure all Passpoint attributes required for production deployment. + +Capabilities for Hotspot 2.0 / Passpoint® include: + +* venue-name +* venue-group +* venue-type +* venue-url +* auth-type +* domain-name +* nai-realm +* osen +* anqp-domain +* anqp-3gpp-cell-net +* firendly-name +* icons + +#### Example Passpoint Configuration + +``` + "interfaces": [{ + + "ssids": [{ + "name": "Mobile Offload", + "wifi-bands": [ + "5G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "wpa-mixed", + "ieee80211w": "optional" + }, + "services": [ + "radius-proxy" + ], + "radius": { + "nas-identifier": "NAS-Lab", + "chargeable-user-id": true, + "authentication": { + "host": "127.0.0.1", + "port": 1812, + "secret": "secret", + "request-attribute": [{ + "id": 126, + "value": "s:TIP" + }] + }, + "accounting": { + "host": "127.0.0.1", + "port": 1813, + "secret": "secret", + "request-attribute": [{ + "id": 126, + "value": "s:TIP" + }], + "interval": 600 + } + }, + "pass-point": { + "venue-name": [ + "eng:Example passpoint_venue", + "fra:Exemple de lieu" + ], + "domain-name": [ + "operator.com" + ], + "asra": false, + "internet": true, + "esr": false, + "uesa": false, + "access-network-type": 0, + "hessid":"11:22:33:44:55:66", + "venue-group": 2, + "venue-type": 8, + "connection-capability":[ + "1:0:2", + "6:22:1", + "17:5060:0" + ], + "roaming-consortium": [ + "A4F5E8F5F4", + "BAA2D00100", + "CAA2D00000", + "DA03BA0000" + ], + "disable-dgaf": true, + "anqp-domain": 8888, + "ipaddr-type-available": 14, + "nai-realm": [ + "0,ooperator.com,21[5:7][2:4],13[5:-1]", + "0,boingo.com,21[5:7][2:4],13[5:-1]" + ], + "osen": false, + "anqp-3gpp-cell-net": [ + "310,410" + ], + "friendly-name": [ + "eng:Operator Labs", + "fra:Operator Labs" + ], + "venue-url": [ + "http://www.example.com/info-fra", + "http://www.example.com/info-eng" + ], + "auth-type": { + "type": "terms-and-conditions" + } + } + }] + }, + +"services": { + + "radius-proxy":{ + "realms":[ + { + "protocol": "radsec", + "realm": ["*.mobile.operator.com"], + "host": "ipv4 address", + "port": 2083, + "auto-discover": false, + "secret": "radsec", + "use-local-certificates": false, + "ca-certificate": "AAAAABBBBBCCCCDDDEEEEEEFFFFNPZ0F3SUJBZ0lKQUxIQmJFWmU3QTBzTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdvTVFzd0NRWUQKVlFRR0V3SlZVekVUTUJFR0ExVUVDQXdLUTJGc2FXWnZjbTVwWVRFUk1BOEdBMVVFQnd3SVUyRnVJRXB2YzJVeApIREFhQmdOVkJBb01FME5wYzJOdklGTjVjM1JsYlhNc0lFbHVZeTR4RkRBU0JnTlZCQXNNQzA5d1pXNXliMkZ0CmFXNW5NUmd3RmdZRFZRUUREQTl2Y0dWdWNtOWhiV2x1Wnk1dmNtY3hJekFoQmdrcWhraUc5dzBCQ1FFV0ZHVnUKWWkxa1pYWnZjSE5BWTJselkyOHVZMjl0TUI0WERURTVNRGt4TmpFeU1EYzFPVm9YRFRNNU1Ea3hNVEV5TURjMQpPVm93Z2FneEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUlEQXBEWVd4cFptOXlibWxoTVJFd0R3WURWUVFICkRBaFRZVzRnU205elpURWNNQm9HQTFVRUNnd1RRMmx6WTI4Z1UzbHpkR1Z0Y3l3Z1NXNWpMakVVTUJJR0ExVUUKQ3d3TFQzQmxibkp2WVcxcGJtY3hHREFXQmdOVkJBTU1EMjl3Wlc1eWIyRnRhVzVuTG05eVp6RWpNQ0VHQ1NxRwpTSWIzRFFFSkFSWVVaVzVpTFdSbGRtOXdjMEJqYVhOamJ5NWpiMjB3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBCkE0SUNEd0F3Z2dJS0FvSUNBUUMwSmM0V3d2QlJJa3BsU0pmdVdZaWo1TTZ2WkRtYVpRNk82YjhGRjBNRVdhZ3UKRFZpVkpRM0JVZ1oyUUtET25JcktNZUlmS3ZWUzRNRWJMM3U0OHgveUtqb09IRkQ0aUhRRTdBUFBvd1BvZkVTcwp4emZveGkwYnozQ3FvK3pXRzVESVJ5V3krNFNDRGlsc2xBN25XU1l5TTdGeUZGWUxvWHdEZVY1N1MzNnJqN3hGClpXdjJ3NjI3dkNPUjJKM2RiYkRLR0ZneEZSVHhMK3I0SWlIWGN5Mm8zaUlwK3R3bDBablJydzBEME5aUmxwNzkKZ2VCS2E5VHZ1MUQxMDcxVWRDQjlaK3VZMFBrNEVaN1dlWVNjWjJhdkxtQjl3cVpkU1F0U2pTQ0xqNVlTOTZzTwpodmlOTWxDb1pNbDBkUE14T2RCb3JZOE52L1VodWk3WDBseUpjKytYaVVuVCs2c05KTXJUeWQ1bCt5OTBmZ0RrCmVqUTNhcWZsTDdRTy9SWjRGejhpL3dCQTRmTWR5TDkvYThqUzBiYWZlc01PZFFDUEd4TThNYXF3QUhZOUN0Z1cKWFFuWi9CT3l3bTArY1gxMkwyd3R3SGFjZ1F6bUROZ2R3NU5PdUdIVEdFcTBpUFVITFBrUXZWc1VTRTBpSUxmZgpXWkhpN2RhOHlsZi9WVktDVjN3U3pKdjc4NXB1c0Z6QVNxbHpLZnErYUs5T1A4bVhyS1dibFZCWHR0aE5mSWJ1CmcvaXNoWW4rYXIrcnlEdmRvL05vL202QjhCemNqVzRWWlIxQkszZUd1R3k2MkhxbTdHMkdZS1FpbkhzdElTYWsKeFFMK3IxOW1HcEhkbzdXcWgyd3ZVZmd6MXN4QjZxOVRhaWZoS21nbEJiSnV1dHpQRFViRHRqWHVlbGcvS1FJRApBUUFCbzJZd1pEQWRCZ05WSFE0RUZnUVVER1Z5QWU4THpNSjR0NVRuRVplVUpXeGVGcE13SHdZRFZSMGpCQmd3CkZvQVVER1Z5QWU4THpNSjR0NVRuRVplVUpXeGVGcE13RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQXpBT0JnTlYKSFE4QkFmOEVCQU1DQVlZd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFGcnlOZldoU2J4RitYS3Nhd29MT2l0bgpDd2ZkTUNrQUJvMWlvWFhyclB1M0xzYm9keXBEdUIwQ2NHdEI1WlZiQ1pSWXBTVFNWMjcramdhRVZlMG1zSk9vCjRoNVBYdnM0QklseTJ6RE1yaE9rTmIxSXN0Y1kyNFdtbGJRYUlBTGcwUW4zQXJTWStITUtUMjhoWjR6bVM3N3QKKzg3d0FYNmlBaGF5QktLWHhJQnQ4VEVTL0hXU0RWczl1RFY4ZjRNTzI0TGozQXBhQkpaV2dFcFpXYi9LdkRmSQp4ckJUK1loL2xTSWpvWGNvZHdNT2dMeTcrLzJrQjZQcXJtWktMcnFWZ3Byd3VXNDJVYVh4YkpYQnFvdmVURkxiCnhXaHA5T1kzbWxnTy9IbWthdS8rUnNLelJzYnJJWGZqRzRDT1ViOHh1ajV1WmZkQ2FYRVlWNnZwdnUwN0NTVEgKZk51VnlZYlMxampLZHRoWE9JQ2YvN3N4YTdiVlpOTkNOQWFwK21FcldPNXQxTEhXdi9ZL0ZYYk5TTVdadlozVApPM0RYc0p5K3grU1piZ283OWhzUktxeDFDSjQybktBaGM2WFZZUkRTOGs0SHZVSzBxbnpTaExvMm5MYTFCVUVMCkkzVnkybDVVMkMxMUYvTDRhNE1Pb2R0Z3h4L0Q5VjI0cWZnTVRPY3Q4bS9QRFB6b1ovL2NoTUpQUU5pWHV5SUEKWmlOUWRxRngrYWI2N1ErM3kwcGxKRDVjVk81Z01MN0F5dXZuMDJlalRhWFYrUkQxVmpoSkRCM0l1Y0FHUnIxLwpVTVVNbmlTZSt4S2FaVHA5SGtza0x2K051ZjV1Slc2VXVHZ0RIbUFCYUFEWUdTMGhKTFU2MjMxMTE3OWh4Q3NmCmVMNXJQdlVtMitRZWhDWURBUjR1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=", + "certificate":"AAAAABBBBBCCCCDDDEEEEEEFFFFS0tCk1JSUNHVENDQWNDZ0F3SUJBZ0lVUjEwVFR5NThxNVF2d1VlVEVsWnZRNE1tYzYwd0NnWUlLb1pJemowRUF3SXcKUVRFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBb1RDa0oxZEhSdmJuZHZiMlF4SFRBYkJnTlZCQU1URkVKMQpkSFJ2Ym5kdmIyUWdVbUZrYzJWaklFTkJNQjRYRFRJeE1EY3hNVEUyTXpNeE5Wb1hEVEl6TURjeE1URTJNek14Ck5Wb3dZakVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFvVENrSjFkSFJ2Ym5kdmIyUXhJekFoQmdOVkJBTVQKR21aaFkyVmliMjlyTG05eWFXOXVMbUZ5WldFeE1qQXVZMjl0TVJrd0Z3WUtDWkltaVpQeUxHUUJBUk1KUjI5dgpaMnhsT2xWVE1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTAvdXpKQ1FZVU1uTXpjMHFzaXBYClZreXkzdkdIM0hOZWxJQnkzTzFGaVMrdVVBa1NUS0VUSHduK1Nza3N1WjIzZnV0bWJzcEQ4bXZQUkI3bXlwZ24KZDZOMU1ITXdEZ1lEVlIwUEFRSC9CQVFEQWdlQU1CTUdBMVVkSlFRTU1Bb0dDQ3NHQVFVRkJ3TUNNQXdHQTFVZApFd0VCL3dRQ01BQXdKUVlEVlIwUkJCNHdISUlhWm1GalpXSnZiMnN1YjNKcGIyNHVZWEpsWVRFeU1DNWpiMjB3CkZ3WURWUjBnQkJBd0RqQU1CZ29yQmdFRUFlNHFBUUVGTUFvR0NDcUdTTTQ5QkFNQ0EwY0FNRVFDSUVKZ00yenoKUXJiR3NZMWticmNOZ1p2QTdBbE02WTllS3d6VWZHSzNGN2d3QWlBbDFmNlVBSGMxVlFmNUgwUVlRbjh4QW1WWAp6azJIQmI3MHMxQjEwN2NKY3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t", + "private-key":"AAAAABBBBBCCCCDDDEEEEEEFFFF0tLS0tCk1IY0NBUUVFSUg0cXVHblBndUIxckk1TnlXejc3ejBvOXRUOGhxN1dBbXVrcFRXa3J2cHdvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFMC91ekpDUVlVTW5NemMwcXNpcFhWa3l5M3ZHSDNITmVsSUJ5M08xRmlTK3VVQWtTVEtFVApId24rU3Nrc3VaMjNmdXRtYnNwRDhtdlBSQjdteXBnbmR3PT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQ==" + }, + { + "protocol": "radius", + "realm": ["*.3gppnetwork.org"], + "auth-server": "ipv4 address", + "auth-port": 11812, + "auth-secret": "secret", + "acct-server": "ipv4 address", + "acct-port": 11813, + "acct-secret": "secret" + }, + { + "protocol": "radius", + "realm": ["operator.com"], + "auth-server": "ipv4 address", + "auth-port": 1812, + "auth-secret": "secret", + "acct-server": "ipv4 address", + "acct-port": 1813, + "acct-secret": "secret" + }, + { + "protocol": "block", + "realm": ["*"], + "message": "realm-not-allowed" + } + ] + } + } +``` + +The above configuration example mobile offload has been configured for two realms that will both have radius traffic sent as radius-proxy via the OpenWiFi Gateway to enable cloud native AAA support for any customer premises topology services are operating from. + diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/qos.md b/device-feature-configuration-examples/device-feature-configuration-examples/qos.md new file mode 100644 index 0000000..c8ada8f --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/qos.md @@ -0,0 +1,86 @@ +--- +description: OpenWiFi +--- + +# QoS + +Quality of service for Wi-Fi involves multiple functions. + +IEEE802.11e says stations will send multiple QoS data frames followed by a block ack request (BAR). The AP will send a block ack frame back that includes a bitmap that indicates which frames were received. + +The 802.11ac-2013 standard states that all data frames be sent as QoS data frames. + +IEEE802.11-2016 Enterprise QoS Includes action frames for many categories such as spectrum management, QoS, HT, VHT, radio measurements, and more 802.11 QoS is achieved by giving high priority queues a statistical advantage at winning contention. + +TIP OpenWiFi implements IEEE802.11-2016 Enterprise QoS features in the following way: + +* Traffic Classifiers fully mapping Wireless Multi-Media with DSCP in 802.11-2016 terms +* Matches by port, range, and or DNS FQDN +* Designed as eBPF Traffic Classifiers TIP OpenWiFi QoS works in Bridge, NAT & VLAN modes +* Enables total Bandwidth to rate-cap forwarding Future per SSID based Traffic Classifiers + +OpenWiFi additionally implements standard buffer bloat control when handling queue behavior during shaping. This feature is known as Qosify. Qosify will set Cake queue discipline behavior using an eBPF classifier to set DSCP per packet as part of wirespeed operations in the Linux kernel. + +### How it works + +Follow the OpenWiFi data model for QoS rules bound to interface via select-ports setting upstream and downstream bandwidth, DSCP marking, protocol and port with an optional FQDN dynamic application match via DNS. Define the wireless-multimedia chosen behavior to set air interface queues. + +TIP OpenWiFi enumerates defined QoS provisioning, as applications or port and protocol matches occur, the Wi-Fi Traffic Identifier (TID) value is set accordingly. + + + +OpenWiFi WMM Supports the following class selector profiles: + +* Enterprise +* RFC8325 - default +* 3GPP + + + +#### Example QoS Definition + +``` + "globals": { + "wireless-multimedia": { + "profile": "rfc8325" + } + + "services": { + "quality-of-service": { + "select-ports": [ "WAN" ], + "bandwidth_up": 1000, + "bandwidth_down": 1000, + "bulk-detection": { + "dscp": "CS1", + "packets-per-second": 500 + }, + "classifier": [ + { + "dscp": "CS1", + "ports": [ + { "protocol": "any", "port": 53 }, + { "protocol": "tcp", "port": 80 } + ], + "dns": [ + { "fqdn": "telecominfraproject.com", "suffix-matching": false } + ] + }, { + "dscp": "AF41", + "dns": [ + { "fqdn": "zoom.us" } + ] + } + ] + } +``` + +In the above example, select-ports was set as WAN. Should the access point have an SSID associated to the WAN interface, the defined QoS settings become applied to both Wi-Fi air interface and the Ethernet interface. By default WAN is chosen for all classification and shaping. + +Bulk detection functions to optimize bulk traffic flows measured in average packet size and packets per second. When bulk-detection is triggered, marking with Diffserv Code Point (DSCP) is possible. Default is CS0. + +Classifier works to specifically trigger on conditional criteria of ports, dns matching individually or in combination with either or both tcp or udp protocols for classification in DSCP terms. When port is set it may be individual or up to an end port when setting range-end value. + +If matching traffic enters already classified in DSCP terms, OpenWiFi by default will reclassify based on the classifier conditions defined unless reclassify is set to false. + + + diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/README.md b/device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/README.md new file mode 100644 index 0000000..eccd312 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/README.md @@ -0,0 +1,100 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# RADIUS Authenticated SSID + +When authenticating clients with back office RADIUS systems, the configuration of OpenWiFi permits this on a per SSID basis. + +{% tabs %} +{% tab title="Simple RADIUS" %} +``` + "interfaces": [ + { + "name": "WAN", + "role": "upstream", + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + }, + "ssids": [ + { + "name": "OpenWifi", + "wifi-bands": [ + "5G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "wpa2", + "ieee80211w": "optional" + }, + "radius": { + "authentication": { + "host": "192.168.178.192", + "port": 1812, + "secret": "secret" + }, + "accounting": { + "host": "192.168.178.192", + "port": 1813, + "secret": "secret" + } + } + } + ] + }, +``` +{% endtab %} + +{% tab title="EAP-Local SSID" %} +``` + "ssids": [ + { + "name": "OpenWifi", + "wifi-bands": [ + "2G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "wpa2", + "ieee80211w": "optional" + }, + "certificates": { + "ca-certificate": "/etc/ucentral/cas.pem", + "certificate": "/etc/ucentral/cert.pem", + "private-key": "/etc/ucentral/key.pem" + }, + "radius": { + "local": { + "server-identity": "OpenWiFi-Local-EAP", + "users": [ + { + "user-name": "open", + "password": "wifi" + } + ] + } + } + } + ] + }, +``` +{% endtab %} +{% endtabs %} + +Many parameters are possible with RADIUS authentications given the many methods in use worldwide. Many of the EAP methods have configuration options described below. + +| RADIUS Attribute | Description | +| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| nas-identifier | Unique NAS Id used with RADIUS server | +| chargeable-user-id | Chargeable User Entity per RFC4372 | +| local |

Local RADIUS within AP device

  • server-identity

    • users - Local EAP users based on username, PreShared Key and VLAN id
| +| authentication |

RADIUS server

  • host IP address
  • port ( example 1812)
  • secret ( Shared secret with RADIUS server )

Additional methods within Access-Request

  • request-attribute ( id of RADIUS server )

    • id ( numeric value of RADIUS server )
    • value

      Any sub-value defined as integer RADIUS attribute value

| +| accounting |

RADIUS server

  • host IP address
  • port ( example 1813)
  • secret ( Shared secret with RADIUS server )

Additional methods within Access-Request sent in Accounting

  • request-attribute ( id of RADIUS server )

    • id ( numeric value of RADIUS server )
    • value

      Any sub-value defined as integer RADIUS attribute value

| +| accounting | interval ( Interim accounting interval defined in seconds ) | diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/dynamic-multi-psk.md b/device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/dynamic-multi-psk.md new file mode 100644 index 0000000..e656072 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/dynamic-multi-psk.md @@ -0,0 +1,38 @@ +# Dynamic Multi PSK + +When venue authentication will support client mobility it is desirable to not cause re-authentication from one AP to another. + +As with the Multi PSK feature that locally provides this functionality to enable a subscriber to have a subscriber based PSK when authenticated creates a private network, this functionality may also be handled via RADIUS to support large venue topologies. + +The authentication protocol type is `psk2-radius` . Add the RADIUS system appropriate for the network. + + + +```json + "ssids": [ + { + "name": "OpenWifi", + "wifi-bands": [ + "2G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2-radius", + "ieee80211w": "optional" + }, + "radius": { + "authentication": { + "host": "192.168.50.30", + "port": 1812, + "secret": "secret" + }, + "accounting": { + "host": "192.168.50.30", + "port": 1813, + "secret": "secret" + } + } + } + ] + +``` diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/dynamic-vlans-with-radius.md b/device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/dynamic-vlans-with-radius.md new file mode 100644 index 0000000..432dc5f --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/dynamic-vlans-with-radius.md @@ -0,0 +1,62 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Dynamic VLANs with RADIUS + +In many deployment scenarios, user authentication is centralized with RADIUS systems. In addition, users may have association to their own networks or private networks. A common approach for this is to dynamically assign VLANs to Wi-Fi subscribers as they join the OpenWiFi network. + +To configure Dynamic VLANs with RADIUS, associate an SSID with RADIUS authentication, and associate the interface to "upstream" role as dynamic VLANs are most likely to be applicable across the service provider, venue, enterprise network. + +``` + "interfaces": [ + { + "name": "WAN", + "role": "upstream", + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + }, + "ssids": [ + { + "name": "OpenWifi", + "wifi-bands": [ + "5G", "2G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "wpa2", + "ieee80211w": "optional" + }, + "radius": { + "authentication": { + "host": "192.168.178.192", + "port": 1812, + "secret": "secret" + }, + "accounting": { + "host": "192.168.178.192", + "port": 1813, + "secret": "secret" + } + } + } + ] + }, +``` + +## RADIUS Access-Accept + +OpenWiFi devices will determine a VLAN is associated to the authentication of a subscriber when the access-accept message returns the following attribute value pairs: + +* Tunnel-Type = 13 +* Tunnel-Medium-Type = 6 +* Tunnel-Private-Group-Id = VLAN Id Number + +Upon return of an access-accept from RADIUS, based on any method chosen for security, OpenWiFi will dynamically create a VLAN Id as described in Tunnel-Private-Group-Id, associated to the interface role, in this example upstream. diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/radius-mac-auth.md b/device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/radius-mac-auth.md new file mode 100644 index 0000000..3c09b9a --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/radius-mac-auth.md @@ -0,0 +1,54 @@ +# RADIUS MAC-Auth + +When deploying headless devices such as IoT services, MAC based authentication dedicated to a unique SSID may be required. TIP OpenWiFi supports MAC-Auth for any SSID when configured with RADIUS parameters set to "mac-filter" true. + + + +Example + +``` + "interfaces": [ + { + "name": "WAN", + "role": "upstream", + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + }, + "ssids": [ + { + "name": "OpenWiFi Headless", + "wifi-bands": [ + "5G", "2G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "none", + "ieee80211w": "optional" + }, + "radius": { + "authentication": { + "host": "192.168.178.192", + "port": 1812, + "secret": "secret", + "mac-filter": true + }, + "accounting": { + "host": "192.168.178.192", + "port": 1813, + "secret": "secret" + } + } + } + ] + }, +``` + + + diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/wispr-subscriber-bandwidth.md b/device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/wispr-subscriber-bandwidth.md new file mode 100644 index 0000000..38525ca --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/radius-authenticated-ssid/wispr-subscriber-bandwidth.md @@ -0,0 +1,17 @@ +--- +description: TIP OpenWiFi +--- + +# WISPr Subscriber Bandwidth + +OpenWiFi supports WISPr Attribute Value Pairs (AVP)s for setting per authenticated subscriber bandwidth in uplink and downlink. + +Provided the SSID has been configured for RADIUS authentication, any access-accept retuned with WISPr Max-Up and Max-Down values, OpenWiFi will restrict per subscriber traffic to these rates. + +**RADIUS Subscriber WISPr Speed Definition:** + +``` + WISPr-Bandwidth-Max-Up := 100, + WISPr-Bandwidth-Max-Down := 100 +``` + diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/roaming-rrm-and-son.md b/device-feature-configuration-examples/device-feature-configuration-examples/roaming-rrm-and-son.md new file mode 100644 index 0000000..a9e6fea --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/roaming-rrm-and-son.md @@ -0,0 +1,129 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Roaming RRM and SON + +Radio Resource Management and Self Organizing Network features in OpenWiFi 2.0 operate by default in local mode from the Access Point device without dependency on the cloud. Data and state related to client steering and roaming is also possible in co-operation with the cloud when so configured. + +Metrics and telemetry are sent to the cloud as desired based on configuration however operation of 802.11k/v/r behavior and autonomous channel control are built in features of all OpenWiFi 2.0 Access Points. + +## Steering + +OpenWiFi services feature "wifi-steering" determines the operating parameters of RRM on the Access Point. + +``` + "services": { + "wifi-steering": { + "mode": "local", + "network": "upstream", + "assoc-steering": true, + "required-snr": -75, + "required-probe-snr": -70, + "required-roam-snr": -85, + "load-kick-threshold": 90 + }, +``` + +When mode is set to local, the Access Point handles steering decisions autonomously with the surrounding OpenWifi devices. Which network association, in this case "upstream" will steering be operating on. Note in prior examples most service provider, venue, enterprise services operate on the WAN side upstream network of the Access Point. + +| Parameter | Value | +| ------------------- | ----------------------------------------------------------------------------- | +| mode: local | autonomous operation | +| network: upstream | performs roaming among SSIDs on upstream interfaces | +| assoc-steering | reject client association requests when the UE is subject to a steering event | +| required-snr | minimum signal in dBm a client will be permitted to remain connected | +| required-probe-snr | minimum signal level in dBm for management probes to be replied to | +| required-roam-snr | minimum signal level in dBm client roaming threshold | +| load-kick-threshold | minimum channel load as % available before clients are kicked | + +## Apply Wi-Fi Steering to enable 802.11r Fast Roaming SSIDs + +``` + "ssids": [ + { + "name": "OpenWiFi Roaming", + "wifi-bands": [ + "2G", "5G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWiFi", + "ieee80211w": "optional" + }, + "roaming": { + "message-exchange": "air", + "generate-psk": true, + "domain-identifier": "EFAB" + }, + "services": [ "wifi-steering" ] + } + ] + }, +``` + +Each SSID to participate in roaming must have "services" : \[ "wifi-steering" ] associated. + +Additional fast roaming configuration is possible including setting message-exchange either to "air" or "ds" to determine pre authenticated message exchange occurs over the air or distribution system. + +The generate-psk option generates FT response locally for PSK networks. This avoids use of PMK-R1 push/pull from other APs with FT-PSK networks. + +Configuring domain-identifier sets Mobility Domain identifier (dot11FTMobilityDomainID, MDID) permitting segmentation of fast roaming RF topologies. + +When pmk-r0-key-holder and pmk-r1-key-holder are left un-configured, the pairwise master key R0 and R1 will generate a deterministic key automatically for fast mobility domain exchange over the air. + +## RRM 802.11k + +To enable 80211k parameters, associate these on a participating SSID basis. + +``` + "ssids": [ + { + "name": "OpenWiFi Roaming", + "wifi-bands": [ + "2G", "5G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWiFi", + "ieee80211w": "optional" + }, + "roaming": { + "message-exchange": "air", + "generate-psk": true, + "domain-identifier": "EFAB" + }, + "rrm": { + "neighbor-reporting": true, + "ftm-responder": true, + "stationary-ap": true + }, + "services": [ "wifi-steering" ] + } + ] + }, +``` + +In addition to 802.11k features for neighbor reporting, fine timing measurement responder and stationary ap indication, OpenWiFi also supports LCI measurement, Civic Location subelement as well. + +## Automatic Channel Balancing + +As part of "wifi-steering" feature, autonomous channel management algorithm may be enabled to establish a self organizing Wi-Fi network. + +The auto-channel setting operates in co-ordination with other OpenWiFi Access Points by enumerating the newest AP in the network, then running neighbor and RF scans to determine the best channel of operation. Once the newest AP completes this process, the next AP is sequence will run the same algorithm for channel balancing until all APs in the network complete. The entire process may take up to 5 minutes the first time a network is powered on. The algorithm will re-run every 12 hours. + +``` + "services": { + "wifi-steering": { + "mode": "local", + "network": "upstream", + "auto-channel": true, + "assoc-steering": true, + "required-snr": -75, + "required-probe-snr": -70, + "required-roam-snr": -85, + "load-kick-threshold": 90 + }, +``` diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/services.md b/device-feature-configuration-examples/device-feature-configuration-examples/services.md new file mode 100644 index 0000000..165b046 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/services.md @@ -0,0 +1,136 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Services + +OpenWiFi devices have global services that operate either independently system wide or as an association to a physical or logical interface. + +Within the "services" configuration block, define the operating mode for each service, then associate a service with an interface. + +## SSH + +Secure shell may optionally be enabled on OpenWiFi devices, associated to specific interface(s), and optionally support operator defined keys or password authentication. + +``` + "services": { + "ssh": { + "port": 22, + "authorized-keys": { + "items": [ + "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC0ghdSd2D2y08TFowZLMZn3x1/Djw3BkNsIeHt/Z+RaXwvfV1NQAnNdaOngMT/3uf5jZtYxhpl+dbZtRhoUPRvKflKBeFHYBqjZVzD3r4ns2Ofm2UpHlbdOpMuy9oeTSCeF0IKZZ6szpkvSirQogeP2fe9KRkzQpiza6YxxaJlWw== user@example", + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ4FDjyCsg+1Mh2C5G7ibR3z0Kw1dU57kfXebLRwS6CL bob@work", + "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBP/JpJ/KHtKKImzISBDwLO0/EwytIr4pGZQXcP6GCSHchLMyfjf147KNlF9gC+3FibzqKH02EiQspVhRgfuK6y0= alice@home" + ] + } + } + } +``` + +### Associate Service to Interface + +``` + { + "name": "LAN", + "role": "downstream", + "services": [ "ssh" ], + "ethernet": [ + { + "select-ports": [ + "LAN*" + ] + } + ], +``` + +### Operator Key Management + +For production deployments, it is recommended to assign operator SSH key from the OpenWiFi Provisioning configuration of the Venue or Entity which the device associates. + +In this way, an operator may ensure their standard SSH key is delivered to all devices on a network operating region basis. All keys remain base64 encoded when added to the device. + +## NTP + +Network time protocol for OpenWiFi devices may be configured to listen for time synchronization from NTP sources and may also be configured to supply NTP source. + +``` + "services": { + "ntp": { + "servers": [ + "0.openwrt.pool.ntp.org", + "1.openwrt.pool.ntp.org" + ] + } + } +``` + +### Associate to an Interface + +``` + { + "name": "WAN", + "role": "downstream", + "services": [ "ntp" ], + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + } + }, +``` + +## LLDP + +Link Layer Discovery Protocol describes interfaces and capabilities between directly attached neighbors over Layer 2. + +``` + "lldp": { + "describe": "OpenWiFi", + "location": "Stadium Level 2" + }, +``` + +Associate "lldp" as a services attribute to any interface. + +## MDNS + +To assist in device or service discovery over smaller networks, multicast DNS (mDNS) protocol if often used. In an mDNS environment there is no local name server for resources to leverage. mDNS zero-configuration service effectively behaves as unicast Domain Name Service (DNS). + +``` + "mdns": { + "enable": true + }, +``` + +Associate "mdns" as a services attribute to any interface. + +## Syslog + +Remote syslog systems may be configured to receive device logs in a central location. This content is standard device log and not related to telemetry for metrics and service information received by the OpenWiFi Gateway. Valid port range is from 100 - 65535 with operation over UDP or TCP. + +``` + "log": { + "host": "Syslog Server IP", + "port": 514, + "proto": "udp" + }, +``` + +Associate "log" as a services attribute to appropriate interface. + +## IGMP + +When enabled the OpenWiFi device will process IGMP Proxy. + +``` + "igmp": { + "enable": true + }, +``` + +Associate "igmp" as a services attribute to any interface participating in IGMP Proxy. diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/vxlan.md b/device-feature-configuration-examples/device-feature-configuration-examples/vxlan.md new file mode 100644 index 0000000..068f870 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/vxlan.md @@ -0,0 +1,59 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# VxLAN + +VXLAN’s goal is allowing dynamic large scale isolated virtual L2 networks to be created for virtualized and multi-tenant environments. It does this by encapsulating Ethernet frames in VXLAN packets which when deployed in Wi-Fi topologies can create highly extensible Layer 2 inter-network domains over large campus, MDU, venue service networks. + +VxLAN header uses a 24-bit VNID as a unique layer 2 forwarding domain value. VxLAN maintains layer 2 isolation between the forwarding domains and does not leak MAC addresses into upstream switches. Through the use of 24 bits in VNID VxLAN scales up to 16 million unique LAN forwarding domains. + +The VXLAN encapsulation method is IP based and provides for a virtual L2 network. With VXLAN the full Ethernet Frame (with the exception of the Frame Check Sequence: FCS) is carried as the payload of a UDP packet. VXLAN utilizes a 24-bit VXLAN header, to identify virtual networks. This header provides for up to 16 million virtual L2 networks. + +Frame encapsulation is done by an entity known as a VxLAN Tunnel Endpoint (VTEP.) A VTEP has two logical interfaces: an uplink and a downlink. The uplink is responsible for receiving VxLAN frames and acts as a tunnel endpoint with an IP address used for routing VxLAN encapsulated frames. + +The VTEP in a TIP OpenWiFi device would be a management interface or designated uplink port(s). VTEP in an AP would be the AP WAN interface, or otherwise designated management interface (such as sub-interface on bridge wan). + +In a traditional L2 switch a behavior known as flood and learn is used for unknown destinations (i.e. a MAC not stored in the MAC table). This means that if there is a miss when looking up the MAC the frame is flooded out all ports except the one on which it was received. When a response is sent the MAC is then learned and written to the table. + +The next frame for the same MAC will not incur a miss because the table will reflect the port it exists on. VXLAN preserves this behavior over an IP network using IP multicast groups. + +## Configure VxLAN + +OpenWiFi device will establish a VTEP adjacency to the upstream switch. It is anticipated that any Wi-Fi networks in a VxLAN topology are associated to "upstream" interface(s). + +The following example creates a VxLAN endpoint from a WAN upstream port that will participate in VLAN 100, encapsulate this into VxLAN where it may be distributed across the campus or venue transparently. + +``` + "interfaces": [ + { + "name": "WAN", + "role": "upstream", + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + } + }, + { + "name": "VXLAN", + "role": "upstream", + "vlan": { + "id": 100 + }, + "tunnel": { + "proto": "vxlan", + "peer-address": "192.168.178.9", + "peer-port": 4789 + }, + "ipv4": { + "addressing": "static", + "subnet": "10.0.0.1/24" + } + }, +``` diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/wds-topologies.md b/device-feature-configuration-examples/device-feature-configuration-examples/wds-topologies.md new file mode 100644 index 0000000..8d5d708 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/wds-topologies.md @@ -0,0 +1,125 @@ +--- +description: OpenWiFi 2.0 +--- + +# WDS + +Wireless Distribution System (WDS) supports an Access Point, Station and Repeater mode of operation. OpenWiFi 2.0 supports all three. + +In the below example, the LAN side of the Access Point at the top of the topology will be wirelessly bridged to the LAN side of the Access Point Station at the bottom of the topology. + +{% tabs %} +{% tab title="WDS-AP" %} +``` + "interfaces": [ + { + "name": "WAN", + "role": "upstream", + "services": [ "lldp" ], + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + } + }, + { + "name": "LAN", + "role": "downstream", + "services": [ "ssh", "lldp" ], + "ethernet": [ + { + "select-ports": [ + "LAN*" + ] + } + ], + "ssids": [ + { + "name": "OpenWifi_WDS_AP", + "wifi-bands": [ + "5G" + ], + "bss-mode": "wds-ap", + "encryption": { + "proto": "psk2", + "key": "OpenWifi", + "ieee80211w": "optional" + }, + "roaming": { + "message-exchange": "ds", + "generate-psk": true + } + } + ], + "ipv4": { + "addressing": "static", + "subnet": "192.168.10.1/24", + "dhcp": { + "lease-first": 10, + "lease-count": 100, + "lease-time": "6h" + } + } + } + ], +``` +{% endtab %} + +{% tab title="WDS-STA" %} +``` + "interfaces": [ + { + "name": "WAN", + "role": "upstream", + "services": [ "lldp" ], + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + } + }, + { + "name": "LAN", + "role": "downstream", + "services": [ "ssh", "lldp" ], + "ethernet": [ + { + "select-ports": [ + "LAN*" + ] + } + ], + "ssids": [ + { + "name": "OpenWifi_WDS_AP", + "wifi-bands": [ + "5G" + ], + "bss-mode": "wds-sta", + "encryption": { + "proto": "psk2", + "key": "OpenWifi", + "ieee80211w": "optional" + }, + "roaming": { + "message-exchange": "ds", + "generate-psk": true + } + } + ], + } +``` +{% endtab %} +{% endtabs %} + +In this configuration, LAN clients of the WDS Station AP receive IP addresses from the WDS Access Point AP from its LAN side DHCP service, via WDS link at 5GHz. diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/wireguard.md b/device-feature-configuration-examples/device-feature-configuration-examples/wireguard.md new file mode 100644 index 0000000..f06f83d --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/wireguard.md @@ -0,0 +1,55 @@ +--- +description: Early Preview Feature +--- + +# Wireguard + +Wireguard is an overlay technology supporting both Layer 2 and Layer 3 operations. In TIP OpenWiFi this is designed as a configured service that is associated to any logical interface. + +As a fully encrypted overlay, key negotiation and exchange of peers is required. This peer endpoint exchange conversation is known as PEX. + +A PEX service is deployed with public network visibility and defined in the wireguard-overlay root-node configuration section of the client. + +Endpoints to be key negotiated with are defined as hosts. + +When this wireguard-overlay is then associated as a service to a layer 3 interface either upstream (WAN) or downstream (LAN) then a layer 3 path is available between the define host endpoints. + +When the wireguard-overlay is associated as a service with vxlan configured, the host adjacencies become layer 2 paths. + + + +**Example:** + +``` +“wireguard-overlay”: { + “private-key”: “####AAAABBBBCCCDDDDEEEFFFFFGGGG“, + “root-node”: { + “key”: “ZZZZWWWWQQQEEERRRTTYYYY“, + “endpoint”: “148.251.188.218", + “ipaddr”: [ “192.168.3.1" ] + }, + “hosts”: [ + { + “name”: “ap1”, + “key”: “CCCCDDDDEEEEFFFFGGGHHHHIIII“, + “ipaddr”: [ “192.168.4.1" ] + }, { + “name”: “ap2", + “key”: “JJJKKKLLLAAABBBBBNCCCC####“, + “ipaddr”: [ “192.168.5.1" ] + } + ], + “vxlan”: { + “isolate”: false + } + } +``` + +#### Peer Endpoint eXchange Service (PEX) + +Currently TIP OpenWiFi wireguard services are an early preview feature. The PEX network discovery daemon service is intended to be containerized and likely re-written as a core service of the TIP OpenWiFi SDK cloud. + +For development members in the Community who wish to begin with this feature, the following repo should be consulted for functional information on a base Linux deployment of PEX via: [https://github.com/nbd168/unetd/blob/master/PEX.md](https://github.com/nbd168/unetd/blob/master/PEX.md) + +Please connect with the Community maintainers via Slack if working on this early access feature. + diff --git a/device-feature-configuration-examples/device-feature-configuration-examples/zero-touch-provisioning.md b/device-feature-configuration-examples/device-feature-configuration-examples/zero-touch-provisioning.md new file mode 100644 index 0000000..60c72b9 --- /dev/null +++ b/device-feature-configuration-examples/device-feature-configuration-examples/zero-touch-provisioning.md @@ -0,0 +1,74 @@ +--- +description: OpenWiFi 2.0 +--- + +# Zero Touch Provisioning + +OpenWiFi supports Zero Touch Provisioning in a number of ways. + +* Zero Touch Mesh +* Zero Touch WDS +* Zero Touch Provisioning ( Provisioning Services in upcoming 2.5/2.6 Release ) + +### Onboarding + +OpenWiFi makes use of TIP device certificates present on every access point as a secure identity from which to automate a number of Zero Touch operations. + +Onboarding is a local EAP-TLS based authentication service available on any OpenWiFi device that works together with default OpenWiFi _firstboot_ behavior to scan for `"OpenWifi-onboarding"` SSID, associate to that SSID, when challenged supply TIP root signed device certificate. + +#### Onboarding Steps + +1. Provision an Access Point for onboarding role as an SSID config\ + `{`\ + `"purpose": "onboarding-ap",`\ + `"bss-mode": "ap",`\ + `"encryption": { "proto": "wpa2", "ieee80211w": "required" },`\ + `"certificates": { "use_local_certificates": true },`\ + `"radius": { "local":`\ + `{ "server-identity": "uCentral-EAP" }`\ + `},`\ + `"name": "OpenWifi-onboarding",`\ + `"wifi-bands": [ "2G" ]`\ + `}` +2. Ensure the SSID for onboarding use provides network connectivity for clients + * Any topology such as NAT, Bridge, VLAN may be used + * Any radio(s) may be used +3. Firstboot devices with no WAN wired port detected will + * Enable all radios + * Scan for SSID "OpenWifi-onboarding" + * Associate and when challenged use TIP certificate as identity + * Obtain IP connection using DHCP over wireless interface association to onboarding AP + * Connect to SDK, obtain provisioning from OpenWiFi Gateway service + * Reload configuration + +### Zero Touch Mesh + +Deployment of Mesh may have multiple Mesh Client access points with no wired connectivity. These devices use IEEE802.11s Mesh participating interface(s) as transit for WAN / LAN connections. + +In a Zero Touch Mesh deployment, the Gateway Access Point, sometimes termed the Root node, advertises mesh participating interfaces when `"bss-mode": "mesh"` is applied to an SSID. Please see [mesh.md](mesh.md "mention") for further details on initial setup. + +Mesh Client Access Points needing to associate wirelessly for initial provisioning to join the mesh network, may be served using the onboarding feature of OpenWiFi. + +Adding an SSID to the Mesh Gateway Access Point configuration to advertise `"OpenWifi-onboarding"` enables initial boot of any OpenWiFi Access Point to reach the OpenWiFi Gateway. + +Upon connection to Onboarding, the Access Point obtains management network access from the upstream Access Point providing `"onboarding-ap"` service. + +With management network access, reachability for the Mesh Client Access Point to the OpenWiFi Gateway should be possible, device provisioning stage will initiate with the production configuration being loaded to the client device. + +Once processed, client Access Point will have receive provisioning to join the Mesh network as a Mesh Client Access Point. + +### Zero Touch WDS + +Deployment of WDS links may have multiple WDS client devices with no wired WAN connectivity. WDS Access Points use the 4-tuple frame header with participating WDS Clients. Therefore WDS Clients must first receive provisioning from the OpenWiFi Gateway for their production state as a WDS link participant. + +WDS Client Access Points needing to associate wirelessly for initial provisioning to join the WDS network, may be served using the onboarding feature of OpenWiFi from the WDS Root Access Point at the top of the topology with a `"bss-mode": "ap"` SSID for onboarding. + +Adding an SSID to the WDS Root Access Point configuration to advertise `"OpenWifi-onboarding"` enables initial boot of any OpenWiFi Access Point to reach the OpenWiFi Gateway. + +Upon connection to Onboarding, the WDS Client Access Point obtains management network access from the upstream WDS Root Access Point providing `"onboarding-ap"` service. + +With management network access, reachability for the WDS Client Access Point to the OpenWiFi Gateway should be possible, device provisioning stage will initiate with the production configuration being loaded to the client device. For more information on WDS configuration please consult [WDS](wds-topologies.md). + +Once processed, WDS Client Access Point will have receive provisioning to join the WDS link as a Client WDS node. + +### diff --git a/openwifi-stack/about-the-sdk.md b/openwifi-stack/about-the-sdk.md new file mode 100644 index 0000000..7df917a --- /dev/null +++ b/openwifi-stack/about-the-sdk.md @@ -0,0 +1,17 @@ +# SDK + +The TIP OpenWiFi SDK supports multiple hardware platforms for Wi-Fi and PoE switching. Commercial controllers are also integrating the OpenWiFi SDK with their go to market offers. This presents great opportunities for many operators. A full SDK for those who seek to work directly with the Open Source project to a full commercial vendor - operator model. + +The OpenWiFi SDK provides a web UI for OpenWiFi administrators. The OpenWiFi UI shows all running services and configurations You can optionally show provisioning, management, and analytics for active deployed networks. All device interactions occur southbound using the OpenWiFi Gateway service. The Gateway implements the uCentral interface standard. + +Subscriber self care is possible at a per-end-customer level. This provides an end-customer a view of their own premises with the ability to configure common settings of their devices. + +All inter-service and NBI relationships are OpenAPI 3.0 compliant. + +You can integrate OSS/BSS (Operations Back Office Support Software) systems with the OpenWifi SDK as a high performance provisioning and device management system. + +## Device Dashboard + +The SDK dashboard shows all devices deployed, their current state, and simplified reports of overall device health. + +![](../.gitbook/assets/image10.png) diff --git a/openwifi-stack/access-points/README.md b/openwifi-stack/access-points/README.md new file mode 100644 index 0000000..0e46700 --- /dev/null +++ b/openwifi-stack/access-points/README.md @@ -0,0 +1,29 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Access Points + +Given many cloud and ODM partners wish to consume the 2.x reference stack early, some with their own device provisioning logic as part of commercial cloud controllers, the following describes uCentral based management and telemetry, interactions with the OpenWiFi SDK processing provisioning and telemetry data. + +## Device Interactions with SDK + +![OpenWiFi with uCentral Management](<../../.gitbook/assets/image (22) (2).png>) + +OpenWiFi 2.0 follows the uCentral system. Complete data model is available [here](http://ucentral.io/docs/ucentral-schema.html). Upon discovery of the cloud, a device default or specific configuration is transferred. + +All devices are known to the cloud by their unique id and provisioned based on advertised capabilities. Each configuration generates a new unique hash value to ensure as devices report back to the cloud, their configuration state is guaranteed. + +If the cloud sends invalid configuration data or the device has insufficient ability to complete the provisioning commands, the error handling process will send this response back to the cloud. + +For example results returned to SDK from a device configuration error: + +``` +"results": { + "serial": "aabbcc00120a", + "status": { + "error": 0, + "rejected": [ + "[W] ("A Reason will be given" + ], +``` diff --git a/openwifi-stack/access-points/local-device-settings.md b/openwifi-stack/access-points/local-device-settings.md new file mode 100644 index 0000000..5f5c5b4 --- /dev/null +++ b/openwifi-stack/access-points/local-device-settings.md @@ -0,0 +1,56 @@ +--- +description: OpenWiFi 2.0 Devices +--- + +# Local Device Settings + +When OpenWiFi devices are unable to connect to the cloud during their initial power on from factory, this may be a result of Internet connectivity issues. + +Certain WAN connections may require credentials such as a username and password or a mobile configuration or simply static address assignment instead of dynamic. + +OpenWiFi 2.0 supports these scenarios. When a device does not have an existing configuration and is unable to contact the cloud for provisioning it enters "Maverick" mode. + +For all Wi-Fi devices this means a Wi-Fi network with the SSID 'Maverick' will become available. Association with and logging in to the device will permit initial WAN connectivity to be entered. + +## Using Maverick + +![Maverick Login Page](<../../.gitbook/assets/Screen Shot 2021-07-29 at 5.04.23 PM.png>) + +After association to the Maverick SSID, open a web browser to `http://192.168.1.1`\ +Log into the OpenWiFi device with username: **`root`** and password: **`openwifi`** + +![Logged into Maverick](<../../.gitbook/assets/Screen Shot 2021-07-29 at 5.06.35 PM (1).png>) + +When the page above is displayed, begin to configure Uplink based on the WAN requirements of the deployment. + +![Uplink Configuration in Maverick](<../../.gitbook/assets/Screen Shot 2021-07-29 at 5.07.50 PM (1).png>) + +If connection uses Point to Point over Ethernet (PPPoE) username and password credentials, enter those values and save. + +![PPPoE Uplink](<../../.gitbook/assets/Screen Shot 2021-07-29 at 5.09.14 PM (1).png>) + +If the OpenWiFi device has a Cellular connection which is possible on device models with 4G and 5G radios, the network Access Point Name (APN) and PIN will be required. These values are supplied by your mobile network provider. + +![Cellular Uplink](<../../.gitbook/assets/Screen Shot 2021-07-29 at 5.11.05 PM (1).png>) + +When dynamic address allocation is not available, static IP address assignment may be required. IPv4 and IPv6 are supported, enter these values with DNS address and save. + +![Uplink Static IP](<../../.gitbook/assets/Screen Shot 2021-07-29 at 5.12.39 PM.png>) + +Otherwise leave the Uplink configuration to DHCP or cloud defaults. + +![Uplink DHCP](<../../.gitbook/assets/Screen Shot 2021-07-29 at 5.13.40 PM.png>) + +## Manual Redirector and Certificate Upload + +If under rare circumstances it is not possible to discover the OpenWiFi cloud associated with the device or there is a need to replace device certificates, this may be configured in Settings. + +![Local Redirector Setting](<../../.gitbook/assets/Screen Shot 2021-07-29 at 5.16.01 PM (1).png>) + +## System + +It is possible to reset the device to defaults, or locally update firmware using the commands available from System. + +![System Commands](<../../.gitbook/assets/Screen Shot 2021-07-29 at 5.17.13 PM (1).png>) + +\*\*\*\* diff --git a/openwifi-stack/artifacts.md b/openwifi-stack/artifacts.md new file mode 100644 index 0000000..0173c08 --- /dev/null +++ b/openwifi-stack/artifacts.md @@ -0,0 +1,20 @@ +# Artifacts + +**Access Point Firmware** + +The Access Point firmware for all supported devices are built on every pull request to the wlan-ap repository. Please see this github workflow for current supported devices: + +[https://github.com/Telecominfraproject/wlan-ap/blob/main/.github/workflows/build-dev.yml](https://github.com/Telecominfraproject/wlan-ap/blob/main/.github/workflows/build-dev.yml) + +\ +These images are then pushed to jfrog in each device specific target directory: + +[https://tip.jfrog.io/artifactory/tip-wlan-ap-firmware/uCentral/](https://tip.jfrog.io/artifactory/tip-wlan-ap-firmware/uCentral/) + + + +**Controller SDK** + +The SDK micro-services are built on every pull request on their respective repositories. These images are then containerized and pushed to jfrog here: + +[https://tip.jfrog.io/ui/repos/tree/General/tip-wlan-cloud-ucentral](https://tip.jfrog.io/ui/repos/tree/General/tip-wlan-cloud-ucentral)\ diff --git a/openwifi-stack/cloud-discovery/README.md b/openwifi-stack/cloud-discovery/README.md new file mode 100644 index 0000000..a318127 --- /dev/null +++ b/openwifi-stack/cloud-discovery/README.md @@ -0,0 +1,21 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Cloud Discovery + +All TIP OpenWiFi devices use the same cloud discovery mechanism on initial boot. + +OpenWiFi devices ship from factory with a unique device certificate signed by the Telecom Infra Project Certificate Authority. + +When a device boots for the first time, or is factory reset, a 'first-boot' process occurs within the device. First-boot initiates a connection over HTTPs to the Certificate Authority requesting the unique device record information. All connections to the Certificate Authority occur over mTLS encrypted session. Devices use their unique certificate identity to authenticate and retrieve the location of the assigned cloud. + +![Device First Boot / Factory Cloud Discovery](<../../.gitbook/assets/image (22).png>) + +Once the cloud location has been learned from first-boot, the device no longer depends on this cloud discovery and will return to the assigned cloud learned from first-boot. + +Devices may periodically initiate connection to the Certificate Authority to validate their unique certificate status. This is a normal process involved in mutual TLS security models. + +When an operator or end customer seeks to change the cloud associated with their device(s), the value of the cloud stored in the Certificate Authority device record is updated. A factory reset of the device will cause first-boot to re-occur which will then discover the new cloud. + +TIP OpenWiFi ODM partners are able to manage device records directly using the Certificate Authority portal. All other users should send an email to licensekeys@telecominfraproject.com to request update of cloud discovery. diff --git a/openwifi-stack/cloud-discovery/discovery-without-cloud.md b/openwifi-stack/cloud-discovery/discovery-without-cloud.md new file mode 100644 index 0000000..31aaaae --- /dev/null +++ b/openwifi-stack/cloud-discovery/discovery-without-cloud.md @@ -0,0 +1,24 @@ +--- +description: TIP OpenWiFi 2.0 +--- + +# Discovery without Cloud + +There could be reasons cloud discovery does not complete. These include: + +* Lack of Internet Connectivity + * Device may require additional WAN settings + * Network may not be connected to Internet +* No Configuration of Cloud in Certificate Authority + * Manufacturer may have left this value blank in the device record stored in Certificate Authority + +![Manual Cloud Entry](<../../.gitbook/assets/image (23).png>) + +When the cloud can not be automatically discovered, OpenWiFi devices will turn on a local admin web UI made available via SSID "Maverick". + +The Maverick UI will support configuring WAN interface parameters, including DHCP, Static, PPPoE, and LTE/5G settings. Please see [Local Device Settings](../access-points/local-device-settings.md) for details on using Maverick.[\ +](../access-points/local-device-settings.md)Additionally the Maverick UI supports direct entry of the cloud for cases when the cloud value has not been supplied during manufacture. + +For non-Wi-Fi devices such as PoE access switches, the same cloud location information may be configured using local management interface. + +![Admin / User Entered WAN or Cloud](<../../.gitbook/assets/image (24).png>) diff --git a/openwifi-stack/openwifi-stack.md b/openwifi-stack/openwifi-stack.md new file mode 100644 index 0000000..9da364c --- /dev/null +++ b/openwifi-stack/openwifi-stack.md @@ -0,0 +1,39 @@ +# Overview + +The TIP OpenWiFi SDK micro services and the AP network operating system (AP NOS) firmware enable many use cases. With TIP OpenWiFi, the entire 'stack' from the cloud to the firmware can be consumed—lowering the cost of entry and time to market of a new entrant. + +![](../.gitbook/assets/image3.png) + +TIP OpenWiFi architecture works specifically to enable choice in device and cloud. Multiple operators have indicated legacy lock in models present with enterprise WLAN systems are lowering deployment velocity, limiting innovation and introducing artificial barriers to new market use cases. + + + +![](<../.gitbook/assets/image (1).png>) + + + +Ensuring lock in is not present is not enough for a mass market solution. It is also necessary to provide customer choice in the cloud whether that customer is the operator or an end user. + +![](<../.gitbook/assets/image (2).png>) + +TIP OpenWiFi offers choice in cloud provider of managed Wi-Fi services. Deployed OpenWiFi based APs initially connect to the internet, dynamically determine the management cloud that will control their operation. If at a later stage it is desired to change the management cloud provider to another operator, OpenWiFi base devices may be redirected to any other TIP OpenWiFi ready cloud. + +This enables multi-vendor device and cloud options given TIP OpenWiFi architecture of common data model and interface for provisioning and telemetry with mutual TLS security. + +## Cloud or On-Premises + +As operators of many sizes, service and network complexities require more Open Source options in their production environments, TIP OpenWiFi presents the opportunity to deploy managed Wi-Fi services either from the cloud or on premises. + +## Security + +In the TIP OpenWiFi solution, all devices may be registered to any TIP OpenWiFi cloud. This is achieved using a unique certificate per device and a first boot process that discovers the serving cloud for the device. TIP works with Digicert, the industry leader in digital security signing infrastructure to ensure a globally redundant and available registrar for TIP OpenWiFi members. The presence of these unique device trust certificates enables a variety of advanced Zero Touch features beyond discovery including device provisioning, mesh, and wireless distribution link onboarding and more. + +## Quality and Development—Continually + +The OpenWiFi team implemented a Continuous Integration / Continuous Deployment (CI/CD) development pipeline that integrated feature development with continuous builds. Recognizing a large factor for operators is the break-fix cycle common in network vendors, OpenWiFi continuous builds are automated into a Quality Assurance (QA) pipeline. + +![](../.gitbook/assets/image6.png) + +At this time, 1,500 nightly tests exercise sanity for all builds of AP NOS and the cloud SDK across the majority of OpenWiFi hardware portfolio. + +![](../.gitbook/assets/image7.png) diff --git a/openwifi-stack/repositories.md b/openwifi-stack/repositories.md new file mode 100644 index 0000000..e586eb5 --- /dev/null +++ b/openwifi-stack/repositories.md @@ -0,0 +1,42 @@ +--- +description: Repository Information +--- + +# Code Repositories + +**Access Point Firmware** + +License: BSD-3-Clause + +* Openwrt based APNOS: [https://github.com/Telecominfraproject/wlan-ap](https://github.com/Telecominfraproject/wlan-ap) + +**Controller SDK** + +License: BSD-3-Clause + +* Gateway Service: [https://github.com/Telecominfraproject/wlan-cloud-ucentralgw](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw) +* Gateway UI: [https://github.com/Telecominfraproject/wlan-cloud-ucentralgw-ui](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw-ui) +* Security Service: [https://github.com/Telecominfraproject/wlan-cloud-ucentralsec](https://github.com/Telecominfraproject/wlan-cloud-ucentralsec) +* Firmware Service: [https://github.com/Telecominfraproject/wlan-cloud-ucentralfms](https://github.com/Telecominfraproject/wlan-cloud-ucentralfms) +* Provisioning Service: [https://github.com/Telecominfraproject/wlan-cloud-owprov](https://github.com/Telecominfraproject/wlan-cloud-owprov) +* Provisioning UI: [https://github.com/Telecominfraproject/wlan-cloud-owprov-ui](https://github.com/Telecominfraproject/wlan-cloud-owprov-ui) +* Analytics Service: [https://github.com/Telecominfraproject/wlan-cloud-analytics](https://github.com/Telecominfraproject/wlan-cloud-analytics) +* Subscriber Service: [https://github.com/Telecominfraproject/wlan-cloud-userportal](https://github.com/Telecominfraproject/wlan-cloud-userportal) + +**Testing** + +License: BSD-3-Clause + +* Open Test Harness and Test cases: [https://github.com/Telecominfraproject/wlan-testing](https://github.com/Telecominfraproject/wlan-testing/tree/master) + +**SDK Load Simulator** + +License: BSD-3-Clause + +* OpenWiFi Load Simulator (OWLS): [https://github.com/Telecominfraproject/wlan-cloud-owls](https://github.com/Telecominfraproject/wlan-cloud-owls/tree/main) + +**Deployment** + +License: BSD-3-Clause + +* Helm and Docker Compose Deployments: [https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/release/v2.4.0) diff --git a/release/features.md b/release/features.md new file mode 100644 index 0000000..cbae9c4 --- /dev/null +++ b/release/features.md @@ -0,0 +1,57 @@ +# Features + +#### Epic + +[WIFI-7573](https://telecominfraproject.atlassian.net/browse/WIFI-7573) Single SSID MDU Solution with Personal Area Network + +#### Improvement + +[WIFI-10040](https://telecominfraproject.atlassian.net/browse/WIFI-10040) SDK Framework Upgrade + +[WIFI-9620](https://telecominfraproject.atlassian.net/browse/WIFI-9620) RADIUS Gateway Proxy + +[WIFI-7571](https://telecominfraproject.atlassian.net/browse/WIFI-7571) Wireguard Overlay Services + +[WIFI-7570](https://telecominfraproject.atlassian.net/browse/WIFI-7570) CSU2 QCA Update + +[WIFI-7077](https://telecominfraproject.atlassian.net/browse/WIFI-7077) Missing Feature in Radsecproxy for 1.x parity and OpenRoaming support + +[WIFI-5820](https://telecominfraproject.atlassian.net/browse/WIFI-5820) Headless devices: Data Model for Open SSID MAC Authentication configuration push to PacketFence + +[WIFI-3758](https://telecominfraproject.atlassian.net/browse/WIFI-3758) Proxy Static Routing Test Functionality + +#### New Feature + +[WIFI-9465](https://telecominfraproject.atlassian.net/browse/WIFI-9465) APNOS: Handling CoA/DM messages + +[WIFI-9121](https://telecominfraproject.atlassian.net/browse/WIFI-9121) make sure vxlan interfaces become part of a bridge + +[WIFI-9120](https://telecominfraproject.atlassian.net/browse/WIFI-9120) add "script" command handling to the AP firmware + +[WIFI-7986](https://telecominfraproject.atlassian.net/browse/WIFI-7986) Add support for Radius TLV (AP Serial Number) using TIP-OWF VSA + +[WIFI-7712](https://telecominfraproject.atlassian.net/browse/WIFI-7712) add support for dual boot + +[WIFI-7572](https://telecominfraproject.atlassian.net/browse/WIFI-7572) Firewall Features + +[WIFI-7458](https://telecominfraproject.atlassian.net/browse/WIFI-7458) Dynamic Subscriber Access - Remote WPA2 Handshake MIC Verification + +[WIFI-3310](https://telecominfraproject.atlassian.net/browse/WIFI-3310) RADIUS Interworking OpenWiFi SDK + +#### Task + +[WIFI-9306](https://telecominfraproject.atlassian.net/browse/WIFI-9306) ipq807x: bring up wallytech dr6018 + +[WIFI-8042](https://telecominfraproject.atlassian.net/browse/WIFI-8042) merge PR fixes from gli.net + +[WIFI-8040](https://telecominfraproject.atlassian.net/browse/WIFI-8040) Add Minim / Motorola Q14 support + +[WIFI-7516](https://telecominfraproject.atlassian.net/browse/WIFI-7516) Support for Indio's UM-305AX AP Based on Mediatek Platform + +[WIFI-7436](https://telecominfraproject.atlassian.net/browse/WIFI-7436) Switch to built-in RTTYS + +[WIFI-7434](https://telecominfraproject.atlassian.net/browse/WIFI-7434) Two SQL injections, GetCommands and DeleteCommands + +[WIFI-7433](https://telecominfraproject.atlassian.net/browse/WIFI-7433) Relative path traversal in RTTYS \[ucentral-gw:rttys] + +[WIFI-7206](https://telecominfraproject.atlassian.net/browse/WIFI-7206) Add workflow to build virtual AP firmware image diff --git a/release/outstanding-items.md b/release/outstanding-items.md new file mode 100644 index 0000000..e37ab92 --- /dev/null +++ b/release/outstanding-items.md @@ -0,0 +1,4 @@ +# Outstanding Items + + [Here](https://telecominfraproject.atlassian.net/wiki/spaces/WIFI/pages/1610973185/2.6+Release+Status+-+In+Progress#Release-Notes) are the outstanding items for this release. + diff --git a/release/resolved-issues.md b/release/resolved-issues.md new file mode 100644 index 0000000..2a4321c --- /dev/null +++ b/release/resolved-issues.md @@ -0,0 +1,241 @@ +# Resolved Issues + +#### Bug + +[WIFI-10070](https://telecominfraproject.atlassian.net/browse/WIFI-10070) Provision Service: Owprov getting restarted after performing firmware upgrade from venue actions + +[WIFI-10053](https://telecominfraproject.atlassian.net/browse/WIFI-10053) Prov service: Unable to fetch the venue analytics data + +[WIFI-10019](https://telecominfraproject.atlassian.net/browse/WIFI-10019) Prov Service: Some blanks entities seen with 404 error + +[WIFI-10017](https://telecominfraproject.atlassian.net/browse/WIFI-10017) Prov Service: Unable to fetch maps + +[WIFI-10005](https://telecominfraproject.atlassian.net/browse/WIFI-10005) prov service : Averaging of memory utilization under venue analytics involves wrong mathematics + +[WIFI-10004](https://telecominfraproject.atlassian.net/browse/WIFI-10004) Prov service: unable to fetch the data while accessing root entity + +[WIFI-9977](https://telecominfraproject.atlassian.net/browse/WIFI-9977) Starting RTTYS session may cause GW to crash + +[WIFI-9966](https://telecominfraproject.atlassian.net/browse/WIFI-9966) Delete button in Venue page missing for configuration + +[WIFI-9959](https://telecominfraproject.atlassian.net/browse/WIFI-9959) Adding default configuration malfunction + +[WIFI-9952](https://telecominfraproject.atlassian.net/browse/WIFI-9952) Gateway restarting issue + +[WIFI-9930](https://telecominfraproject.atlassian.net/browse/WIFI-9930) Self Hosted Runners are not picking up properly + +[WIFI-9927](https://telecominfraproject.atlassian.net/browse/WIFI-9927) Prov Service: We have 2 create tabs in Main Entity and Venue pages for creating child Entity and child venue. + +[WIFI-9925](https://telecominfraproject.atlassian.net/browse/WIFI-9925) Prov Service: Unable to create a new map when map page is in any customized map( Root node is in blocked state) + +[WIFI-9924](https://telecominfraproject.atlassian.net/browse/WIFI-9924) Prov Service: Unable to load Provising UI \[page in qa01 instance. + +[WIFI-9921](https://telecominfraproject.atlassian.net/browse/WIFI-9921) Gateway Service: Telemetry fetching all the data when type is only selected to Wifi-frames/State/DHCP-Snooping + +[WIFI-9920](https://telecominfraproject.atlassian.net/browse/WIFI-9920) RTTYS does not work after upgrade to v2.6.0-RC5 + +[WIFI-9839](https://telecominfraproject.atlassian.net/browse/WIFI-9839) prov service: clicking on the contacts throwing an error + +[WIFI-9838](https://telecominfraproject.atlassian.net/browse/WIFI-9838) prov service: clicking on the AP mac address under raw data is throwing an error. + +[WIFI-9837](https://telecominfraproject.atlassian.net/browse/WIFI-9837) prov service: navigating from venues to sub venues opening the operators tab + +[WIFI-9836](https://telecominfraproject.atlassian.net/browse/WIFI-9836) prov service: under dash board firmware is showing unknown + +[WIFI-9835](https://telecominfraproject.atlassian.net/browse/WIFI-9835) prov service: under dash board average device type is showing unknown + +[WIFI-9834](https://telecominfraproject.atlassian.net/browse/WIFI-9834) prov service: under dash board average uptime of an AP is not updating + +[WIFI-9833](https://telecominfraproject.atlassian.net/browse/WIFI-9833) prov service: under dash board memory of an AP is not updating + +[WIFI-9832](https://telecominfraproject.atlassian.net/browse/WIFI-9832) prov service: under dash board health of an AP is not updating + +[WIFI-9828](https://telecominfraproject.atlassian.net/browse/WIFI-9828) APs suddenly getting disconnected from gateway side + +[WIFI-9790](https://telecominfraproject.atlassian.net/browse/WIFI-9790) prov service : the Live View not showing all the AP's in graph + +[WIFI-9787](https://telecominfraproject.atlassian.net/browse/WIFI-9787) prov service : rounding off the averaged values are not even. + +[WIFI-9773](https://telecominfraproject.atlassian.net/browse/WIFI-9773) WiFi Scan is not working as there is no request going when user click on Wifi Scan + +[WIFI-9744](https://telecominfraproject.atlassian.net/browse/WIFI-9744) PROV-UI: OWSEC is not showing on the System page + +[WIFI-9660](https://telecominfraproject.atlassian.net/browse/WIFI-9660) If we give invalid IP address, It is not throwing any error + +[WIFI-9654](https://telecominfraproject.atlassian.net/browse/WIFI-9654) \[MPSK Remote]The request to Packet Fence is getting rejected due to duplicate VSA attribute send from AP + +[WIFI-9643](https://telecominfraproject.atlassian.net/browse/WIFI-9643) Prov UI: Port forwarding is not throwing up error when given invalid IP and when same external port and different internal port. + +[WIFI-9635](https://telecominfraproject.atlassian.net/browse/WIFI-9635) Radius Proxy Config not accepted by AP + +[WIFI-9632](https://telecominfraproject.atlassian.net/browse/WIFI-9632) Analytics may lock. + +[WIFI-9621](https://telecominfraproject.atlassian.net/browse/WIFI-9621) The Error is showing up when password authentication is disabled (when modified from disable-->enable--->disable) + +[WIFI-9619](https://telecominfraproject.atlassian.net/browse/WIFI-9619) Prov Service: client life cycle tab showing no results + +[WIFI-9616](https://telecominfraproject.atlassian.net/browse/WIFI-9616) Provisioning Service restarted while performing configuration push testing altering Weight parameter + +[WIFI-9615](https://telecominfraproject.atlassian.net/browse/WIFI-9615) Prov Service: Interval in Analytics is taking the negative values for Seconds. + +[WIFI-9614](https://telecominfraproject.atlassian.net/browse/WIFI-9614) Prov Service: Retention in Analytics is taking the negative values for Days. + +[WIFI-9601](https://telecominfraproject.atlassian.net/browse/WIFI-9601) Prov Service: Analytics is not checking the mandatory tabs. + +[WIFI-9600](https://telecominfraproject.atlassian.net/browse/WIFI-9600) Prov Service: Search button under inventory is getting blocked randomly + +[WIFI-9598](https://telecominfraproject.atlassian.net/browse/WIFI-9598) Prov Service: Venue Dash board is unable to fetch showing an error + +[WIFI-9596](https://telecominfraproject.atlassian.net/browse/WIFI-9596) Prov Service: mini map is removed under the map in the latest version. + +[WIFI-9595](https://telecominfraproject.atlassian.net/browse/WIFI-9595) Prov Service: color indications are removed under the map in the latest version. + +[WIFI-9564](https://telecominfraproject.atlassian.net/browse/WIFI-9564) unable to give contact no in my account + +[WIFI-9563](https://telecominfraproject.atlassian.net/browse/WIFI-9563) Significance of State in device details, it not showing any data regarding connected/disconnected state of AP + +[WIFI-9562](https://telecominfraproject.atlassian.net/browse/WIFI-9562) System tab is showing no info in OWSUB and throwing an error after refreshing. + +[WIFI-9561](https://telecominfraproject.atlassian.net/browse/WIFI-9561) Config page is not staying back after the device specific configuration is saved to push the configuration + +[WIFI-9558](https://telecominfraproject.atlassian.net/browse/WIFI-9558) Prov service: importing the APs from csv file format is throwing error + +[WIFI-9555](https://telecominfraproject.atlassian.net/browse/WIFI-9555) Prov UI: Zoom in, Zoom out options are not visible as they were seen in previous versions + +[WIFI-9553](https://telecominfraproject.atlassian.net/browse/WIFI-9553) Prov UI: Sub-Venues analytics is not seen in the main venue + +[WIFI-9552](https://telecominfraproject.atlassian.net/browse/WIFI-9552) Prov UI: Health in Prov UI dashboard is not not matching with health in gateway + +[WIFI-9551](https://telecominfraproject.atlassian.net/browse/WIFI-9551) Prov UI: Analytics not getting saved and taking long time to load dashboard, Live view and Client Lifecycle + +[WIFI-9538](https://telecominfraproject.atlassian.net/browse/WIFI-9538) Prov UI: Random Selection of config in Entity level + +[WIFI-9537](https://telecominfraproject.atlassian.net/browse/WIFI-9537) Gateway went down unexpectedly and required manual restart + +[WIFI-9472](https://telecominfraproject.atlassian.net/browse/WIFI-9472) Provisoning: "Error Fetching Analytics" error message appears when we navigate to each entity + +[WIFI-9471](https://telecominfraproject.atlassian.net/browse/WIFI-9471) Prov UI: QR code Error while doing Multi factor Authentication in Google Authenticator + +[WIFI-9470](https://telecominfraproject.atlassian.net/browse/WIFI-9470) Prov UI: Status in columns is un-ticked but still visible in Raw Data + +[WIFI-9469](https://telecominfraproject.atlassian.net/browse/WIFI-9469) Prov UI: Deleted Configuration still shown even after deleting it without getting it saved + +[WIFI-9467](https://telecominfraproject.atlassian.net/browse/WIFI-9467) Prov UI: While Creating a location, Country is not marked as required and US is default chosen + +[WIFI-9466](https://telecominfraproject.atlassian.net/browse/WIFI-9466) Prov UI: Unable to add a device and contact in a Root Entity + +[WIFI-9461](https://telecominfraproject.atlassian.net/browse/WIFI-9461) RADIUS information configuring differently in AP + +[WIFI-9362](https://telecominfraproject.atlassian.net/browse/WIFI-9362) Provisioning UI: Live View noise display not accurate and not labelled properly + +[WIFI-9305](https://telecominfraproject.atlassian.net/browse/WIFI-9305) ath11k: WDS not working in station mode + +[WIFI-9235](https://telecominfraproject.atlassian.net/browse/WIFI-9235) Provisioning Service UI: Client LIfecycle table not refreshing + +[WIFI-9234](https://telecominfraproject.atlassian.net/browse/WIFI-9234) Gateway UI refresh not working + +[WIFI-9162](https://telecominfraproject.atlassian.net/browse/WIFI-9162) Prov UI: Error while editing and saving a configuration + +[WIFI-9158](https://telecominfraproject.atlassian.net/browse/WIFI-9158) CIG-194C4 is broken after upgrade to images post 5/17 + +[WIFI-8096](https://telecominfraproject.atlassian.net/browse/WIFI-8096) API error is showing while pushing any configuration on AP + +[WIFI-8057](https://telecominfraproject.atlassian.net/browse/WIFI-8057) Basic 3: Ec420 testbed is crashed and we are not able to access it. + +[WIFI-8054](https://telecominfraproject.atlassian.net/browse/WIFI-8054) UI page pointing wrong Image even if we able to upgrade the AP + +[WIFI-8053](https://telecominfraproject.atlassian.net/browse/WIFI-8053) WPA security feature is not working on few APs + +[WIFI-8049](https://telecominfraproject.atlassian.net/browse/WIFI-8049) TLS security feature is not working on any testbeds + +[WIFI-8037](https://telecominfraproject.atlassian.net/browse/WIFI-8037) The Ap is automatically after some time getting offline but connected clients are shown in udaya ap + +[WIFI-8012](https://telecominfraproject.atlassian.net/browse/WIFI-8012) In bridge-mode clients associated to AP can not ping each other. + +[WIFI-8004](https://telecominfraproject.atlassian.net/browse/WIFI-8004) Provision UI: Root/Admin Users don't have access to delete other maps + +[WIFI-7997](https://telecominfraproject.atlassian.net/browse/WIFI-7997) AP is pointing to new serial number with newer Firmware image + +[WIFI-7992](https://telecominfraproject.atlassian.net/browse/WIFI-7992) Provision UI: The Entities, Venues and Devices are not aligned properly after creating new map + +[WIFI-7974](https://telecominfraproject.atlassian.net/browse/WIFI-7974) Provision UI: unable to edit and save configuration while doing device specific configuration + +[WIFI-7972](https://telecominfraproject.atlassian.net/browse/WIFI-7972) Provision UI: Setting default map is not persisting + +[WIFI-7955](https://telecominfraproject.atlassian.net/browse/WIFI-7955) Public IP visibility on AP + +[WIFI-7948](https://telecominfraproject.atlassian.net/browse/WIFI-7948) Not able to get the client-ip (for connected users) in kafka stream + +[WIFI-7909](https://telecominfraproject.atlassian.net/browse/WIFI-7909) Streaming telemetry to Kafka does not stop after lifetime + +[WIFI-7891](https://telecominfraproject.atlassian.net/browse/WIFI-7891) Prov-UI: trying to add interface config and update is failing through Prov ui. + +[WIFI-7880](https://telecominfraproject.atlassian.net/browse/WIFI-7880) Multiple BSSID configuration tab for 6g client is not present in tagged parameters + +[WIFI-7876](https://telecominfraproject.atlassian.net/browse/WIFI-7876) Provision UI: Serial number column is by default in Increasing order sorting + +[WIFI-7875](https://telecominfraproject.atlassian.net/browse/WIFI-7875) Provision UI: All Special Characters are not accepted in Password + +[WIFI-7867](https://telecominfraproject.atlassian.net/browse/WIFI-7867) Add Content-Type header to CLI script commands where it is required + +[WIFI-7855](https://telecominfraproject.atlassian.net/browse/WIFI-7855) 6g Channel number fixed in the configuration file not reflecting in iwinfo. + +[WIFI-7851](https://telecominfraproject.atlassian.net/browse/WIFI-7851) Rtty on the latest 2.6 is broken + +[WIFI-7841](https://telecominfraproject.atlassian.net/browse/WIFI-7841) Provision UI : Configuratons are lost after UI upgraded to Version 2.6.189 + +[WIFI-7838](https://telecominfraproject.atlassian.net/browse/WIFI-7838) Client IP Address not available + +[WIFI-7830](https://telecominfraproject.atlassian.net/browse/WIFI-7830) ip-collide / routing metric not mitigating + +[WIFI-7828](https://telecominfraproject.atlassian.net/browse/WIFI-7828) owsec service: 403 response code while logout the token during sanity runs + +[WIFI-7810](https://telecominfraproject.atlassian.net/browse/WIFI-7810) Not seeing any FILS in the 6g broadcast information + +[WIFI-7779](https://telecominfraproject.atlassian.net/browse/WIFI-7779) Provision UI: Emails ID's are not verifying while users creating their Account + +[WIFI-7674](https://telecominfraproject.atlassian.net/browse/WIFI-7674) FMS: FIRMWARE Version JSON is missing Image + +[WIFI-7616](https://telecominfraproject.atlassian.net/browse/WIFI-7616) qa01 gateway with 2.6 release has sluggishness/slowness on output when commands executed on rtty session. eg: iwinfo, logread etc. + +[WIFI-7611](https://telecominfraproject.atlassian.net/browse/WIFI-7611) Laptop fails to connect to Indio's UM-305AX AP + +[WIFI-7586](https://telecominfraproject.atlassian.net/browse/WIFI-7586) Prov-UI: User creation enforces password rule. but rule is not defined. + +[WIFI-7585](https://telecominfraproject.atlassian.net/browse/WIFI-7585) Prov-UI:Configuration pushed from Prov-UI gets pushed and reflects timestamp on Gw, but not in config/ or on command history + +[WIFI-7584](https://telecominfraproject.atlassian.net/browse/WIFI-7584) Prov-UI:when I connect to device using"connect" tab on Gateway, and login, logread command is not returning..its stuck. + +[WIFI-7564](https://telecominfraproject.atlassian.net/browse/WIFI-7564) The qa01 gateway service going down frequently after 2.6 upgrade + +[WIFI-7554](https://telecominfraproject.atlassian.net/browse/WIFI-7554) Actiontec WEB7200 APs factory partition corrupted on sysupgrade + +[WIFI-7553](https://telecominfraproject.atlassian.net/browse/WIFI-7553) WF610D upgrade fails from 2.4.1 to 2.5.0 build + +[WIFI-7515](https://telecominfraproject.atlassian.net/browse/WIFI-7515) Assertion violation when starting RTTYS session + +[WIFI-7442](https://telecominfraproject.atlassian.net/browse/WIFI-7442) Wifi-6E AP does not connect to 5G clients + +[WIFI-7265](https://telecominfraproject.atlassian.net/browse/WIFI-7265) Ath11k DFS not performing as expected + +[WIFI-7189](https://telecominfraproject.atlassian.net/browse/WIFI-7189) Throughput significantly decreases while running L3 traffic with QoS config + +[WIFI-7188](https://telecominfraproject.atlassian.net/browse/WIFI-7188) Clients are unable to scan 2G SSID in sanity + +[WIFI-6854](https://telecominfraproject.atlassian.net/browse/WIFI-6854) Rate limiting feature is not working with multiple SSIDs + +[WIFI-6392](https://telecominfraproject.atlassian.net/browse/WIFI-6392) uCentral client does not reconnect automatically + +[WIFI-6343](https://telecominfraproject.atlassian.net/browse/WIFI-6343) AP deleted from CloudSDK GUI is not listed in under Tables after re-registering + +[WIFI-6342](https://telecominfraproject.atlassian.net/browse/WIFI-6342) User accounts not displayed + +[WIFI-6325](https://telecominfraproject.atlassian.net/browse/WIFI-6325) Copy to clipboard option isn't working + +[WIFI-6171](https://telecominfraproject.atlassian.net/browse/WIFI-6171) Wi-scan feature in UI failure with 5Ghz SSID's + +[WIFI-6159](https://telecominfraproject.atlassian.net/browse/WIFI-6159) UI: Device status are showing incorrect values across different graphs + +[WIFI-1834](https://telecominfraproject.atlassian.net/browse/WIFI-1834) ecw5410: WiFi to LAN connectivity broken in bridge setup. + +[WIFI-1699](https://telecominfraproject.atlassian.net/browse/WIFI-1699) ecw5410: dnsmasq was not running. diff --git a/release/security.md b/release/security.md new file mode 100644 index 0000000..1881b0b --- /dev/null +++ b/release/security.md @@ -0,0 +1,14 @@ +# Security Updates + +The following list of major security enhancements have been implemented within the 2.6 release: + +[https://telecominfraproject.atlassian.net/browse/WIFI-7337](https://telecominfraproject.atlassian.net/browse/WIFI-7337) + +| **Issue** | **Description** | **Resolution** | +| ----------------------------------------------------------------------- | ----------------------------------------------------- | ---------------------------------------------------- | +| [WIFI-7433](https://telecominfraproject.atlassian.net/browse/WIFI-7433) | Path traversal in RTTYS | Implemented path validation within requests handling | +| [WIFI-7434](https://telecominfraproject.atlassian.net/browse/WIFI-7434) | SQLi in GetCommands and DeleteCommands REST endpoints | Implemented input validation for commandUUID | + +### Known security issues + +* None diff --git a/release/testing-results.md b/release/testing-results.md new file mode 100644 index 0000000..13b44c6 --- /dev/null +++ b/release/testing-results.md @@ -0,0 +1,27 @@ +# Testing Results + +All releases undergo a rigorous amount of testing that include: + +* Sanity +* Performance +* RF Testing +* Regression +* Testing with real devices (Interop) + +Our current community test result dashboards: + +Sanity: [http://openwifi-allure-reports.s3-website-us-east-1.amazonaws.com/sanity/overview/](http://openwifi-allure-reports.s3-website-us-east-1.amazonaws.com/sanity/overview/) + +Interop: [http://openwifi-allure-reports.s3-website-us-east-1.amazonaws.com/interop/overview/](http://openwifi-allure-reports.s3-website-us-east-1.amazonaws.com/interop/overview/) + +Regression: [http://openwifi-allure-reports.s3-website-us-east-1.amazonaws.com/regression](http://openwifi-allure-reports.s3-website-us-east-1.amazonaws.com/regression) + +Performance: [http://openwifi-allure-reports.s3-website-us-east-1.amazonaws.com/performance/overview/](http://openwifi-allure-reports.s3-website-us-east-1.amazonaws.com/performance/overview/) + +RF Testing: [http://openwifi-allure-reports.s3-website-us-east-1.amazonaws.com/advanced/overview/](http://openwifi-allure-reports.s3-website-us-east-1.amazonaws.com/advanced/overview/) + + + +**Here are the** [**results**](https://telecominfraproject.atlassian.net/wiki/spaces/WIFI/pages/1610973185/2.6+Release+Status+-+In+Progress#AP-Models-Under-Test) **of our testing results for our current release.** + +**** diff --git a/release/whats-new.md b/release/whats-new.md new file mode 100644 index 0000000..0bf9acb --- /dev/null +++ b/release/whats-new.md @@ -0,0 +1,62 @@ +# What's New + +The latest release includes the following new features. + +## APNOS + +* Ath11k Ath12k CSU updates + * Latest stable Qualcomm patches + * Kernel and back port handling 5.10 – 5.4 +* L3 Collision Enhancement + * Second device WAN detects itself in the same IP space as its own LAN + * Second LAN Auto-Select Non-Overlapping next nibble subnet +* OpenRoaming Feature Parity +* Expanded Wi-Fi Scan + * \>30 IEs now available using the API +* RADIUS Proxy – Gateway • TIP Vendor 58888 + * Device Serial Number added by host apd + * Gateway sends to pool of RADIUS servers + * Response handled cloud native to Gateway Northbound + * Gateway over WebSocket to AP (hostapdonlocalhost) +* Enables Dynamic Multi-PSK + * KeyNonce shared via RADIUS +* Per UE + * Uplink/Downlink Traffic Control over WISPr AVPs + * PSK per VLAN +* Enables Change of Authorization (CoA) and Disconnect Message (DM) via Cloud Managed Service Provider (MSP) + * Re-use of the WebSocket requires no additional networking or device agent support + * Permits all Cloud MSPs to use the Cloud SDK for any AAA messaging + * AAA builds knowledge of the TIPPEN 5888 Serial Number + +## SDK + +The latest release includes the following new SDK features. + +### Provisioning Service + +* New UI with Quality Dashboard per Venue/Entity +* Operators, Subscriber Devices, Subscribers +* Device Specific Configurations +* Venue Resources +* Interface Configuration +* Venue Notifications WebSocket +* Google Authenticator for Multi-Factor +* Self-care Portal API for mobile app devs +* Analytics + * Client Lifecycle ( life of a UE ) + * Venue dashboard ( Associations, AP health, Status ) + * Live View ( Active UE Associations, Connection Quality ) + +### Gateway Service + +* Bandwidth and IE options in the WiFi Scan API +* Entity/Venue/Subscriber device association +* Ping device RTT latency +* Telemetry via WebSocket or Kafka +* WebSocket state for device reboot/firmware update in device page updates and device list tables +* RADIUS Pool ( Proxy ) + +### Analytics Service + +* Aggregation of telemetry per Venue +* Enables Provisioning Dashboards and any dev seeking aggregation by Venue or Entity diff --git a/sdk-installation/deploy-using-docker-compose.md b/sdk-installation/deploy-using-docker-compose.md new file mode 100644 index 0000000..5d91e59 --- /dev/null +++ b/sdk-installation/deploy-using-docker-compose.md @@ -0,0 +1,132 @@ +--- +description: TIP OpenWiFi 2.0 SDK +--- + +# Deploy using Docker Compose + +The docker-compose [directory](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/release/v2.4.0/docker-compose) within the deploy repository contains all the relevant files for various modes of SDK. + +### Modes + +The following two modes are currently supported by docker-compose: + +* **Deployments without a Load Balancer** + + This model contains single instances of SDK micro-services. Non-Load Balancer is suitable for scenarios where load given number of APs is below 10,000 or design for network availability is not required.\ + A single local docker-compose deployment performance is listed [here](https://github.com/Telecominfraproject/wlan-docs/blob/2.6.0/sdk-installation/broken-reference/README.md). Additionally this deployment includes options to use either self-signed certificates or user provided certificates: + + * Non-LB deployment with self-signed certificates + * [Non-LB deployment with own certificates](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/release/v2.4.0/docker-compose#non-lb-deployment-with-own-certificates) +* **Deployments with a Load Balancer** + + This model is suitable for deployments where there is a need to scale performance and/or use Letsencrypt certificates for northbound service interactions.\ + This deployment allows the user to scale up number of instances of micro-services to handle a larger load than listed [here](https://github.com/Telecominfraproject/wlan-docs/blob/2.6.0/sdk-installation/broken-reference/README.md).\ + The repository contains the instructions here: + + * [LB deployment with self-signed certificates](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/release/v2.4.0/docker-compose#lb-deployment-with-self-signed-certificates) + * [LB deployment with Letsencrypt certificates](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/release/v2.4.0/docker-compose#lb-deployment-with-letsencrypt-certificates) + +The docker-compose yaml files are related as follows to the modes above: + +* docker-compose.yml : manages Non-LB deployment with self-signed and own certificates +* docker-compose.lb.selfsigned.yml: manages LB deployment with self-signed certificates +* docker-compose.lb.letsencrypt.yml: manages LB deployment with Letencrypt certificates + +### Docker Compose Environment Variables + +The deployments are managed using different environment files for docker-compose: + +* .env : used for non LB deployments with either self-signed or own certificate deployments executed by docker-compose. For additional information please read [this](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/main/docker-compose#non-lb-deployment-with-self-signed-certificates). +* .env.selfsigned: used for LB with self-signed deployments executed by alias docker-compose-lb-selfsigned. For additional information please read [this](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/main/docker-compose#lb-deployment-with-self-signed-certificates). +* .env.letsencrypt: used for LB with letsencrypt deployments executed by alias docker-compose-lb-letsencrypt. For additional information please read [this](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/tree/main/docker-compose#lb-deployment-with-letsencrypt-certificates). + +### Volumes + +The deployment creates local volumes to persist mostly application and database data. In addition to that several bind mounts are created: + +`docker-compose/certs/` directory used by multiple services + +`docker-compose/{microservice}_data/` directory used by each service for configuration and data. Where {microservice} is one of: owgw, owsec, owfms and owprov. + +{% hint style="info" %} +Be aware that the deployment uses bind mounts on the host to mount certificate and configuration data for the microservices and therefore these files and directories will be owned by the user in the container. Since the files are under version control, you may have to change the ownership to your user again before pulling changes. +{% endhint %} + +### Configuration Variables + +Localizing the installation to the production environment is done through configuration information environment files per microservice. These files are: owgw.env, owgw-ui.env, owsec.env, owfms.env, owprov.env and owprov-ui.env.\ +These env files are used to generate runtime configuration (properties) file when no configuration is found in their respective {microservices}-data directory. + +### Ports + +Exposed port dependencies by application are listed below: + +`127.0.0.1:80/443 tcp` - OpenWiFi-uCentralGW-UI\ +`127.0.0.1:8080/8443 tcp` - OpenWiFi-Provisoning-UI\ +`127.0.0.1:5912/tcp` - rttys dev\ +`127.0.0.1:5913/tcp` - rttys user\ +`0.0.0.0:15002/tcp` - OpenWiFi-uCentralGW websocket\ +`127.0.0.1:16002/tcp` - OpenWiFi-uCentralGW REST API public\ +`0.0.0.0:16003/tcp` - OpenWiFi-uCentralGW fileupload\ +`127.0.0.1:16102/tcp` - OpenWiFi-uCentralGW alivecheck\ +`127.0.0.1:16001/tcp` - OpenWiFi-uCentralSec REST API public\ +`127.0.0.1:16101/tcp` - OpenWiFi-uCentralSec alivecheck + +{% hint style="info" %} +By default only the websocket and fileupload component of the OpenWiFi uCentralGW (Gateway) microservice are exposed on all interfaces. All other exposed services listen on localhost. You can change that according to your needs in the `ports` sections of`docker-compose/docker-compose.yml`. +{% endhint %} + +### Default Certificates + +When cloning the repository, by default the southbound websocket certificate signed by TIP Root CA is provided for the \*.wlan.local domain. Additionally a self-signed certificate for the northbound REST API is present. These enable creating a local deployment out of the box. Production deployments will replace both the southbound websocket and northbound API certificates. + +The supplied certificates are valid for the `*.wlan.local` domain. + +## How to + +1. First you'll have to [install Docker Compose](https://docs.docker.com/compose/install/) according to your platform specific instructions. After that clone the repository with `git clone https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy`. +2. The Docker Compose uCentral microservice configs use `openwifi.wlan.local` as a hostname, so make sure you add an entry in your hosts file (or in your local DNS solution) which points to `127.0.0.1` or the IP of the host running the SDK. +3. Switch to the Compose project directory with `cd docker-compose/`. +4. Default user is: tip@ucentral.com and password is: openwifi + 1. Service enforces a password change on first login +5. Initialize the deployment with `docker-compose up -d`. If your deployment was successfully created, you should see the following output with `docker-compose ps`: + +``` + Name Command State Ports +--------------------------------------------------------------------------------------------------------------------------------------------------------------------- +openwifi_kafka_1 /opt/bitnami/scripts/kafka ... Up 9092/tcp +openwifi_owfms_1 /docker-entrypoint.sh /ope ... Up 0.0.0.0:16004->16004/tcp,:::16004->16004/tcp, 0.0.0.0:16104->16104/tcp,:::16104->16104/tcp, 17004/tcp +openwifi_owgw-ui_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:443->443/tcp,:::443->443/tcp, 0.0.0.0:80->80/tcp,:::80->80/tcp +openwifi_owgw_1 /docker-entrypoint.sh /ope ... Up 0.0.0.0:15002->15002/tcp,:::15002->15002/tcp, 0.0.0.0:16002->16002/tcp,:::16002->16002/tcp, + 0.0.0.0:16003->16003/tcp,:::16003->16003/tcp, 0.0.0.0:16102->16102/tcp,:::16102->16102/tcp, 17002/tcp +openwifi_owprov-ui_1 /docker-entrypoint.sh ngin ... Up 80/tcp, 0.0.0.0:8080->8080/tcp,:::8080->8080/tcp, 0.0.0.0:8443->8443/tcp,:::8443->8443/tcp +openwifi_owprov_1 /docker-entrypoint.sh /ope ... Up 0.0.0.0:16005->16005/tcp,:::16005->16005/tcp, 0.0.0.0:16105->16105/tcp,:::16105->16105/tcp, 17005/tcp +openwifi_owsec_1 /docker-entrypoint.sh /ope ... Up 0.0.0.0:16001->16001/tcp,:::16001->16001/tcp, 0.0.0.0:16101->16101/tcp,:::16101->16101/tcp, 17001/tcp +openwifi_rttys_1 /rttys/rttys Up 0.0.0.0:5912->5912/tcp,:::5912->5912/tcp, 0.0.0.0:5913->5913/tcp,:::5913->5913/tcp +``` + +1. When the certificate for the REST API and other components is self-signed, accepting trust for the self-signed REST API certificate on your local machine is required.\ + Add `certs/restapi-ca.pem` to your trusted browser certificates or add certificate exceptions in your browser by visiting each of the following URLs (one per port) :\ + `https://openwifi.wlan.local:16001 and ports :16002 :16003 :16004 and :16005`\ + \ + Using the browser, accept the self-signed SSL certificate warnings (make sure to visit both and add the exceptions). +2. Connect to your AP via SSH and add a static hosts entry in `/etc/hosts` for `openwifi.wlan.local` which points to the address of the host the SDK deployment runs on. +3. While staying in the SSH session, copy the content of `certs/restapi-ca.pem` on your local machine to your clipboard and append it to the file `/etc/ssl/cert.pem` on the AP. This way your AP will also trust the self-signed certificate. This step is necessary for rtty features and only required when using self-signed test deployment. +4. Navigate in a web browser to `https://openwifi.wlan.local` to access the UI and login with default username and password. You will now be prompted to change this default password to something more secured. + +![](<../.gitbook/assets/Screen Shot 2021-12-08 at 2.14.02 PM.png>) + +1. To use the curl test scripts which are included in the microservice repositories make sure to set the following environment variables before issuing a request: + +``` +export UCENTRALSEC="openwifi.wlan.local:16001" +export FLAGS="-s --cacert /docker-compose/certs/restapi-ca.pem" +``` + +### Upgrading Compose Deployments + +Stop the running containers with `docker-compose down` + +Check out the new branch by repeating _Step 1_ from _How to_ above for the given release and `docker-compose up -d`. + +Don’t forget to re-add the self-signed certificates to the containers with the provided script. Also be aware that you may have to change back some file permissions. To obtain the most recent changes as the files are under version control, you may have to change the ownership to your user again before pulling changes. diff --git a/sdk-installation/deploy-using-helm.md b/sdk-installation/deploy-using-helm.md new file mode 100644 index 0000000..030c234 --- /dev/null +++ b/sdk-installation/deploy-using-helm.md @@ -0,0 +1,60 @@ +--- +description: TIP OpenWiFi 2.0 SDK +--- + +# Deploy using Helm + +SDK can be deployed to Kubernetes using a Helm package. The Helm package code is located at [https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/) repository. + +Each microservice in the OpenWiFi SDK system has its own Helm chart that is managed in the microservice’s own repository. The assembly chart collects all the relevant microservice charts and other external dependencies like kafka, rtty, etc. and deploys them together as one cohesive release. + +You can review the full list of all the assembled microservices and related dependencies here: [https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/blob/main/chart/Chart.yaml#L6](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/blob/main/chart/Chart.yaml#L6) + +## Installation + +There are multiple ways you can install OpenWiFi SDK with assembly charts: + +1. One way is by installing directly from the assembly chart’s repository. For that, you’ll need to install and extra Helm plugin that is used to pull the latest charts code from all the referenced microservices: [https://github.com/aslafy-z/helm-git](https://github.com/aslafy-z/helm-git). +2. Another way, which is considered more stable, is by installing from a prepackaged bundle that is published to [https://tip.jfrog.io/ui/native/tip-wlan-cloud-ucentral-helm/](https://tip.jfrog.io/ui/native/tip-wlan-cloud-ucentral-helm/) on every official uCentral release. For this approach to work, you don’t need to install any additional plugins or dependencies, just to make sure you’ve got Helm installed on your local system. + +### Directly from the Assembly repository + +1. Install the helm-git pluging according to the official documentation +2. Run helm upgrade --install tip-ucentral git+[https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/@chart?ref=main](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/@chart?ref=main) +3. You can also reference any other open branch from the deployment repository. For example, if you want to deploy using the assembly code from the v2.0.0-rc1 branch, you can just run helm upgrade --install tip-ucentral git+[https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/@chart?ref=v2.0.0-rc1](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/@chart?ref=v2.0.0-rc1) + +### Using the pre-built Helm package + +1. This method doesn’t require to install anything locally other than Helm +2. Start by adding the wlan-cloud-ucentral Helm repository to your local list of repositories by running helm repo add tip-ucentral [https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/](https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/) +3. helm upgrade --install tip-ucentral wlan-cloud-ucentral to install the latest version, or specify the release you want to install by adding the --version x.y.z flag. + +## Chart configuration using the Values file + +The configuration of OpenWiFi SDK using Helm chart may be separated into layers: + +1. Micro services default values - values files that are stored in microservice helm charts (i.e. [https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/helm/values.yaml](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/helm/values.yaml) ). These values are used by default if no other parameters are supplied, so in case you have any microservice-related variables that need to be added in default installation (for example new application configuration properties), add them in the related helm chart values as they will be applied in next release update. +2. Assembly chart values - values that are stored in the assembly repository ([https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/blob/main/chart/values.yaml](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/blob/main/chart/values.yaml) ) – these are values that override default microservices values so that all uCentral components could connect to each other correctly, and the whole system can be installed as one bundle. These parameters are environment specific, and can differ between and installation of the bundle on an EKS cluster or a MicroK8s local setup. +3. Helm upgrade/install flag overwrites - these values cam be specific for each specific helm install command during execution and usually contain installation-specific values like TLS certificates, security credentials, loadbalancer configuration parameters and so on. These may be passed using --set flag or --values flag (details may be found in [https://helm.sh/docs/chart\_best\_practices/values/](https://helm.sh/docs/chart\_best\_practices/values/) and in microservices helm charts), or you can also save them into one file and reference this file during the helm upgrade command using the --values flag. + +During deployment all values are merged as maps with priority to the level of deployment (so Environment-specific values will override any overrides from Assembly chart values and so on). + +**Example**: Let’s pass environment-specific ucentralgw.properties configuration parameter (which is probably quite common thing to test). For example, we have an environment that requires to set parameter ucentral.websocket.host.0.backlog to 1000. For that we would need to run following command, extending our base command: + +``` +helm upgrade --install tip-ucentral git+https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy/@chart?ref=main --set ucentralgw.configProperties."ucentral\.websocket\.host\.0\.backlog"=1000 +``` + +## Automated community deployment + +OpenWiFi SDK can also be deployed to an AWS labs environment using a Github actions workflow: [https://github.com/Telecominfraproject/wlan-testing/actions/workflows/ucentralgw-deployment.yaml](https://github.com/Telecominfraproject/wlan-testing/actions/workflows/ucentralgw-deployment.yaml). + +The configuration is dynamic, and new namespaces (a.k.a environments) may be created by adjusting the json configuration in the workflow. + +The json format allows to deploy or upgrade and existing environment using the latest Docker images or to specify a specific version of each microservice. + +To deploy specific version to the specific environment a list of things must be done: + +1. First, you need to make sure that the Docker image with the correct version exists in Artifactory, otherwise, the Helm upgrade will fail. +2. Update the json configuration in the workflow to reference the require version for the require microservice (examples are attached in the json file itself) +3. Re-run the deployment in Github actions. You can also make all the above changes in a separate branch, and re-run the workflow from that branch (using a drop-down in the top left corner in Github’s UI). diff --git a/sdk-installation/overview.md b/sdk-installation/overview.md new file mode 100644 index 0000000..43476f6 --- /dev/null +++ b/sdk-installation/overview.md @@ -0,0 +1,11 @@ +# Overview + +The [wlan-cloud-ucentral-deploy](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy) repository contains two packaging options: + +* [Docker Compose](deploy-using-docker-compose.md) +* [Helm](deploy-using-helm.md) + +The repository is managed using branches where: + +* main branch: contains references to the latest development SDK images +* release/v_**X.Y.Z**_ branch: contains image references specific to the release artifacts. For example: release/**v2.4.0** branch will contain references to SDK images related to 2.4.0 release candidates (RC) and GA. diff --git a/sdk/getting-started.md b/sdk/getting-started.md new file mode 100644 index 0000000..553a58a --- /dev/null +++ b/sdk/getting-started.md @@ -0,0 +1,25 @@ +--- +description: TIP OpenWiFi 2.x +--- + +# Getting Started + +OpenWiFi 2.0 Minimum Viable Product at the end of July, 2021 enables a cloud native and cloud agnostic Software Development Kit (SDK) with management and deployment support for a wide range of Access Point and PoE network switch platforms. + +## Release 2.6 SDK includes: + +* Zero Touch Cloud Discovery +* Firmware Management +* Venue Provisioning +* Analytics Aggregation +* Venue Dashboards +* User Interface for Provisioning & Analytics +* Gateway Service - RADIUS Proxy + + + +OpenWiFi 2.0 SDK is deployable as both a Docker Compose or a Helm on Kubernetes model. See [this](broken-reference) section for installation instructions. + + + +Find out what is [new](../release/whats-new.md) in our current release. diff --git a/sdk/monitoring/README.md b/sdk/monitoring/README.md new file mode 100644 index 0000000..d74f403 --- /dev/null +++ b/sdk/monitoring/README.md @@ -0,0 +1,181 @@ +--- +description: OpenWiFi 2.0 Telemetry and Analysis +--- + +# Monitoring + +TIP OpenWiFi software stack is envisioned to have a rich telemetry data that can be extracted, transformed and stored for analytics purposes. This section will outline various integration using the current capabilities of the OpenWiFi release. These integrations will provide examples for the community to enrich, adopt and productize. + +The current release of OpenWiFi utilizes both a rich open API and Kafka for retrieving telemetry information from Access Points and SDK services. For the purpose of this section and Release 2.0 we will be showcasing Kafka integration with 3rd-party monitoring subsystems. + +## Kafka Data Source + +The current release of 2.0 SDK architecture contains a Kafka broker for the purposes inter-services communication, state, healthcheck, device provisioning state producing and consuming Kafka topics. You can find the latest information related to Kafka topics here: [https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/KAFKA.md#kafka-integration](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/KAFKA.md#kafka-integration) + +The current Kafka topics used for this monitoring integration are: + +* state +* healthcheck + +All Kafka messages carry a JSON payload, example of a healthcheck message is as follow: + +``` +{ + "system":{ + "id":179033843641952, + "host":"https://gw-ucentral-dev01.cicd.lab.wlan.tip.build:17002" + }, + "payload":{ + "data":{ + "interfaces":{ + "up0v0":{ + "dhcp":false, + "location":"/interfaces/0" + } + }, + "unit":{ + "memory":36 + } + }, + "sanity":67, + "serial":"112233445566", + "uuid":1627357625 + } +} +``` + +A state Kafka message looks like: + +``` +{ + "system":{ + "id":179033843641952, + "host":"https://gw-ucentral-dev01.cicd.lab.wlan.tip.build:17002" + }, + "payload":{ + "serial":"112233445566", + "state":{ + "interfaces":[ + { + "clients":[ + { + "ipv6_addresses":[ + "fe80:0:0:0:206:aeff:fee0:69ad" + ], + "mac":"07:06:06:06:06:06", + "ports":[ + "eth1" + ] + }, + { + "ipv4_addresses":[ + "192.168.4.1" + ], + "mac":"01:02:03:04:05:06", + "ports":[ + "eth1" + ] + } + ], + "counters":{ + "collisions":0, + "multicast":63, + "rx_bytes":14725, + "rx_dropped":0, + "rx_errors":0, + "rx_packets":209, + "tx_bytes":13571, + "tx_dropped":0, + "tx_errors":0, + "tx_packets":80 + }, + "dns_servers":[ + "1.1.1.1", + "9.9.9.9" + ], + "ipv4":{ + "addresses":[ + "192.168.4.33/24" + ], + "leasetime":600 + }, + "location":"/interfaces/0", + "name":"up0v0", + "uptime":31349 + }, + { + "counters":{ + "collisions":0, + "multicast":0, + "rx_bytes":0, + "rx_dropped":0, + "rx_errors":0, + "rx_packets":0, + "tx_bytes":1058, + "tx_dropped":0, + "tx_errors":0, + "tx_packets":5 + }, + "ipv4":{ + "addresses":[ + "192.168.1.1/24" + ] + }, + "location":"/interfaces/1", + "name":"down1v0", + "uptime":31355 + } + ], + "radios":[ + { + "active_ms":24459917, + "busy_ms":1173593, + "channel":149, + "channel_width":"80", + "noise":4294967198, + "phy":"soc/40000000.pci/pci0000:00/0000:00:00.0/0000:01:00.0", + "receive_ms":4647, + "transmit_ms":88272, + "tx_power":30 + }, + { + "active_ms":24456321, + "busy_ms":11878205, + "channel":11, + "channel_width":"20", + "noise":4294967204, + "phy":"platform/soc/a000000.wifi", + "receive_ms":1329, + "transmit_ms":73228, + "tx_power":30 + }, + { + "active_ms":24458178, + "busy_ms":1162312, + "channel":36, + "channel_width":"80", + "noise":4294967192, + "phy":"platform/soc/a800000.wifi", + "receive_ms":12339, + "transmit_ms":86904, + "tx_power":23 + } + ], + "unit":{ + "load":[ + 0.190921, + 0.263188, + 0.240726 + ], + "localtime":1627418941, + "memory":{ + "free":348540928, + "total":520409088 + }, + "uptime":31386 + } + }, + "uuid":1627357625 + } +} +``` diff --git a/sdk/monitoring/elk-integration.md b/sdk/monitoring/elk-integration.md new file mode 100644 index 0000000..a06001d --- /dev/null +++ b/sdk/monitoring/elk-integration.md @@ -0,0 +1,21 @@ +--- +description: Kafka integration with ELK +--- + +# ELK Integration + +The following pipeline is used to leverage Kafka messages being emitted from OpenWiFi 2.0 for ELK (Elastic Logstash Kibana) stack integration : + +![](../../.gitbook/assets/kafka-ELK-pipeline.png) + +TIP OpenWiFi project has deployed an ELK stack for community members to access [here](https://kibana.lab.wlan.tip.build). + +The key for this integration is to use a plugin that enables Kafka to be used as an input for Logstash. This plugin can be found [here](https://www.elastic.co/guide/en/logstash/current/plugins-inputs-kafka.html). Once installed then Logstash can be configured to listen to the input source of the Kafka broker that is deployed as part of OpenWiFi SDK 2.0 release and its appropriate topics. Here is a [sample](https://github.com/Telecominfraproject/wlan-cloud-ucentral-analytics) Logstash configuration. + +It is important to note that Logstash provides the ability to transform messages which then can be pushed to Elasticsearch for storage with effective indexing. Finally Kibana is used to create visualization such as this: + +![](../../.gitbook/assets/kibana.png) + +![](../../.gitbook/assets/kibana-2.png) + +The following [repository](https://github.com/Telecominfraproject/wlan-cloud-ucentral-analytics) will be used to store necessary files for integration examples for monitoring. diff --git a/sdk/provisioning/README.md b/sdk/provisioning/README.md new file mode 100644 index 0000000..9d72ca3 --- /dev/null +++ b/sdk/provisioning/README.md @@ -0,0 +1,33 @@ +--- +description: uCentral Data Model Introduction +--- + +# Provisioning for Integrators + +OpenWiFi 2.x makes it possible for integrators of the SDK to implement commercial products leveraging OpenWiFi Gateway service with vendor supplied provisioning above OpenWiFi SDK. As a minimum, the OpenWiFi 2.0 SDK framework offers a Security service which handles all OpenAPI authentication northbound, and the Gateway service which provides all uCentral websocket interface functionality southbound. + +![Minimum 2.0 SDK - Assumes DB is either SQLite or PGSql](<../../.gitbook/assets/image (28).png>) + +OpenWiFi also provides options to receive telemetry and events over both OpenAPI interface as well as Kafka message bus. When using Kafka, OpenWiFi Gateway directly publishes telemetry and event topics to the bus. + +In future sprints of OpenWiFi dynamic device provisioning will be available as an added microservice. + +## Gateway + +OpenWiFi 2.0 Gateway implements the uCentral device management interface. uCentral specifies the data model and interface for management and telemetry of OpenWrt based devices. Gateway uCentral interface is a websocket JSON-RPC based design between OpenWiFi Gateway and the device running uCentral agent. + +![Southbound Interface to Devices](<../../.gitbook/assets/image (29).png>) + +All communications from Gateway to Device are secured using mutual Transport Layer Security (mTLS). In mTLS systems each endpoint is a unique device sharing the same signed root or intermediate trust. In OpenWiFi each device has a signed certificate, key and device identifier. These are validated by the uCentral-Gateway to establish mTLS session. + +Upon successful connection the device exchanges its capabilities with the OpenWiFi SDK. OpenWIFi SDK, via the Gateway microservice will send the entire device provisioning data as a JSON payload. Within OpenWiFi devices, the uCentral agent has a reader and renderer process providing serialization and validation of data sent from cloud. If any data presented can not be processed by the local agent, this is returned within an ERROR message using the same websocket connection. + +![High Level SDK Gateway to uCentral Agent](<../../.gitbook/assets/image (22) (2).png>) + +If the device agrees with provisioning information presented, the render process builds calls into the operating system configuration sub-system known as UCI. The Unified Configuration Interface ensures OpenWrt compliant syntax is persisted within the device. + +Configuration source of truth is the OpenWiFi SDK. Consistency of device configuration is handled with an applied hash compared by the Gateway for each device. If the value differs on device from that of the stored information in cloud, the device will be immediately resent its configuration from the OpenWiFi SDK Gateway service. + +Once present, all configuration data is preserved on device restart. + +It is possible to generate device configurations outside of the OpenWiFi 2.0 SDK as shown in the minimum SDK image at the start of this page. This may occur for some integrations or may occur when the OpenWiFi Provisioning microservice is not present. In this way, integrators of commercial products are welcome to build device provisioning outside of OpenWiFi and use the OpenWiFi cloud to manage the scale, state, security and validation of device websocket communications. diff --git a/sdk/provisioning/creating-a-configuration.md b/sdk/provisioning/creating-a-configuration.md new file mode 100644 index 0000000..8c28691 --- /dev/null +++ b/sdk/provisioning/creating-a-configuration.md @@ -0,0 +1,195 @@ +--- +description: OpenWiFi 2.0 Device Configuration +--- + +# Creating a Configuration + +To introduce the Community to the uCentral data model structure, the below illustrates a basic Access Point configuration that assumes a typical enterprise Wi-Fi scenario of a ceiling mount or wall mount device presenting a single WAN interface with a private management network and separate Wi-Fi network on a virtual local area network. + +## Start with Location and Radios + +We will set the unit location and timezone, then proceed to configure radios. + +``` +{ + "uuid": 2, + "unit": { + "location": "TIP Lab Network", + "timezone": "EST+5EDT,M3.2.0/2,M11.1.0/2" + }, + "radios": [ + { + "band": "5G", + "country": "CA", + "channel": "auto", + "channel-mode": "HE", + "channel-width": 80, + "require-mode": "HT", + "rates": { + "beacon": 6000, + "multicast": 24000 + } + }, + { + "band": "2G", + "country": "CA", + "channel": 11, + "channel-mode": "HE", + "channel-width": 80, + "require-mode": "HT", + "rates": { + "beacon": 6000, + "multicast": 24000 + } + } + ], +``` + +In this example, a two radio device that indicates it is Wi-Fi 6 as the channel-mode values for both radios is "HE" which defines 802.11ax operation. Valid values are "HT" -High Throughput 802.11n mode, "VHT" - Very High Throughput 802.11ac mode, "HE" - High Efficiency 802.11ax mode. + +Channel defines the specific channel number the radio shall operate on as an integer from 1 - 171 and may also be set to a string for "auto" mode. Channel width permits configuring the amount of RF channel the radio will operator over from 20-40-80-160 including 8080 mode (also known as 80+80) . + +OpenWiFi radios may be set to require UE clients to associate to a minimum standard such as excluding any 802.11b associations depicted above with "require-mode" set to "HT" meaning 802.11n or higher clients may associate. + +Control of beacon interval and multicast rates is possible per radio as shown in the "rates" section. + +## Interfaces + +OpenWiFi 2.0 offers a highly flexible model for arranging network interfaces. Multi-port devices may be easily provisioned for numerous types of network segmentation and logical network configuration. We will start with a simple WAN that has a management IP and also a VLAN sub-interface for a logical SSID in a subsequent step. + +``` + "interfaces": [ + { + "name": "WAN", + "role": "upstream", + "services": [ "lldp", "dhcp-snooping" ], + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], + "ipv4": { + "addressing": "dynamic" + } + }, +``` + +In the above configuration block we have a WAN interface, its role is "upstream" meaning it faces the upstream in terms of service it provides (WAN). This has a direct alignment to how the device interprets a physical or logical port participates in bridge forwarding domains. + +Note we want this port to have an IP address for its management, therefore the "ipv4" configuration is associated as a child of any Ethernet WAN ports and set to DHCP. + +### Common Config - VLAN on WAN for SSID + +Imagine the OpenWiFi device is an enterprise Access Point mounted on a ceiling. These devices do not always have a LAN port. Also in an enterprise, it is likely the Wi-Fi services are in their own network segments and not subject to Network Address Translation (NAT). Since the enterprise would also not want Wi-Fi on the same network as Management, an 802.1Q Virtual LAN is used. + +``` + { + "name": "WAN100", + "role": "upstream", + "services": [ "lldp", "dhcp-snooping" ], + "vlan": { + "id": 100 + }, + "ethernet": [ + { + "select-ports": [ + "WAN*" + ] + } + ], +``` + +In this next section of configuration, an additional logical interface associated to the WAN ports for the VLAN id of "100" is shown. Note there is no IP address associated to this interface, it is a layer 2 interface that will emit on any and all WAN ports with VLAN id 100. + +To associate the Wi-Fi with the VLAN interface define, we continue within the WAN100 interface adding SSID services. + +``` + "ssids": [ + { + "name": "TIP OpenWiFi", + "wifi-bands": [ + "5G", "2G" + ], + "bss-mode": "ap", + "encryption": { + "proto": "psk2", + "key": "OpenWiFi", + "ieee80211w": "optional" + } + }, + "services": [ "wifi-frames"] +``` + +Within the "ssids" configuration block we can process an array of SSIDs. Often there may be separate "2G" and "5G" configurations. We have grouped them in this introductory example for simplicity however "2G", "5G", "5G-lower", "5G-upper", "6G" are all valid options. + +The "name" value is the advertised SSID clients will discover for this access point. Hidden is supported by setting the "hidden-ssid" to true. Which operating mode is determined by "bss-mode". The "bss-mode" is a highly flexible operating parameter to determine "ap", "sta", mesh", "wds-ap", "wds-sta", "wds-repeater" radio modes of operation. + +Security of the SSID is determined using the "encryption" section. Many options are possible, in this initial example, a WPA-PSK2 shared key encryption is shown. Lastly, for devices that support, 802.11w protected management frames are defined as optional for this SSID. This may also be disabled or required. + +Metrics for wifi-frames will be described next. + +### Sending Data + +Add metrics to our configuration that will help expose state of the Wi-Fi network and its services to the cloud. + +``` + "metrics": { + "statistics": { + "interval": 120, + "types": [ "ssids", "lldp", "clients" ] + }, + "health": { + "interval": 120 + }, + "wifi-frames": { + "filters": [ "probe", + "auth", + "assoc", + "disassoc", + "deauth", + "local-deauth", + "inactive-deauth", + "key-mismatch", + "beacon-report", + "radar-detected"] + }, + "dhcp-snooping": { + "filters": [ "ack", + "discover", + "offer", + "request", + "solicit", + "reply", + "renew" ] + } + }, +``` + +Within metrics it is possible to define the interval for sending information to the cloud. Additionally the type of information sent is defined here. In this example configuration there are associated services to interfaces along the way. This included LLDP and dhcp-snooping and wifi-frames. + +Within each uCentral device, the agent has a global health check feature that includes memory, cpu, temperature operating states in addition to performing various network and service health tests. The interval at which these reports are sent to the cloud is configured within health. + +For all SSIDs that have wifi-frames associated as a service, the listed management frame types will be gathered and sent to the cloud, on each interval. + +To assist with fingerprinting and client troubleshooting, dhcp-snooping sends the cloud all current client DHCP and DHCPv6 state. + +### Global Services + +The final section of the simple configuration example turns on LLDP and SSH where those services were associated to interfaces listed above. + +``` + "services": { + "lldp": { + "describe": "TIP OpenWiFi", + "location": "LivingLab" + }, + "ssh": { + "port": 22 + } + } +} +``` + +The complete simple configuration file as described in this page may be downloaded here: diff --git a/sdk/provisioning/data-model-introduction.md b/sdk/provisioning/data-model-introduction.md new file mode 100644 index 0000000..c79218b --- /dev/null +++ b/sdk/provisioning/data-model-introduction.md @@ -0,0 +1,29 @@ +--- +description: OpenWiFi 2.0 +--- + +# Data Model Introduction + +OpenWiFi 2.0 data model for device management is based on uCentral. + +uCentral is set to become a leading component of OpenWrt, as such will have a diverse, and worldwide developer and support base in open source. + +Within the model it is possible to provision or return state for all aspects of an OpenWiFi based device easily structured as a JSON payload. + +The complete data model may be found here :[ ](https://github.com/Telecominfraproject/wlan-ucentral-schema)[https://github.com/Telecominfraproject/wlan-ucentral-schema](https://github.com/Telecominfraproject/wlan-ucentral-schema) + +## Organization + +Each device has a Universally Unique Identifier (UUID). For each device, the configuration presented either manually, via the future Provisioning service from OpenWiFi or via a commercial controller generation of provisioning data, the high level relationships of the schema may be understood as follows. + +![uCentral Agent Schema Processing](<../../.gitbook/assets/image (32).png>) + +The unique device record has a set of top level configurations. A device is referred to as a 'unit' that may have a Description, Location, TimeZone as example. Each unit may have globals for IPv4 and IPv6 networks that are derived to lower lever interfaces in later generation. + +Services and Metrics are associated with logical and physical interfaces. Services enable configuration of features such as LLDP or SSH, rTTY, IGMP, 802.1x, RADIUS Proxy, WiFi-Steering, or NTP and are then associated with Interfaces as desired. + +Interfaces define upstream and downstream configuration over both Wi-Fi logical (SSID) and wired physical ports. + +Metrics enable visibility to the cloud for numerous states of the device. These are associated per interface and may be sent in 60 second or greater intervals and include Statistics of SSID, LLDP, Clients. Also include Health check reports of device load, network reachability, temperature. To assist with fingerprinting DHCP-Snooping exposes numerous interactions of IP binding to clients. Additionally wifi-frames expose all 802.11 management frames to the SDK Gateway. + +It is also possible to configure config-raw elements that will parse direct UCI commands once the device provisioning has been completed by the uCentral agent. diff --git a/sdk/sdk.md b/sdk/sdk.md new file mode 100644 index 0000000..fb6e550 --- /dev/null +++ b/sdk/sdk.md @@ -0,0 +1,20 @@ +--- +description: TIP OpenWiFi 2.6 +--- + +# Release 2.6 SDK + +Release 2.6 SDK offers a number of ways to consume OpenWiFi. Available as a single Docker for just the uCentralGW or as a set of microservices offering increasing value to consume helps multiple eco-system partners use as much or as little as desired to integrate with or build a commercial product on the TIP OpenWiFi SDK. + +Initial features of the 2.0 SDK at MVP include: + +* RBAC based security framework +* OpenAPI compliant Northbound +* Kafka Message Bus +* PGSql HA Cluster +* Firmware Manager +* Central Logging Dashboard +* User Interface +* Docker Compose & Helm DevOps Deployment Automation + +![OpenWiFi 2.0 SDK](<../.gitbook/assets/image (31).png>) diff --git a/sdk/user-interface/README.md b/sdk/user-interface/README.md new file mode 100644 index 0000000..f0fee49 --- /dev/null +++ b/sdk/user-interface/README.md @@ -0,0 +1,77 @@ +--- +description: OpenWiFi 2.0 +--- + +# User Interface for Admins + +Release 2.0 user interfaces (UI) are designed as a Single-Page Application (SPA). \ +The UI serves as an example user interface built using React to demonstrate several interactions using the northbound OpenAPI. \ +Release 2.0 to 2.5 had a first generation of the UI framework. This first generation UI framework is seen for the Gateway and Firmware service. With the introduction of 2.6 and the Provisioning and Analytics services, a new UI for those specific SDK services has been introduced. + +All UI interactions consume the OpenAPI of the SDK services. + +The following describes the likely starting point for an Administrator. Using the Provisioning service to define how the Wi-Fi networks in Entity, Venue and device provisioning terms may optionally be defined. + +## Login to OpenWiFi SDK - Provisioning + + + +![Login to Provisioning](<../../.gitbook/assets/Screen Shot 2022-07-19 at 2.36.39 PM.png>) + +Default username is: **`tip@ucentral.com`** and password is: **`openwifi`** + +On first login, the default user account will prompt to change password. This behavior is also available for all admin defined accounts added to the system. + +## **Base Navigation** + +On initial login the Provisioning service places the user on the Inventory screen. + +![Provisioning Inventory](<../../.gitbook/assets/Screen Shot 2022-07-19 at 2.39.45 PM.png>) + +Inventory enables the admin to visually identify OpenWiFi devices not currently assigned to an Entity, Create a new device, execute commands per device, inspect device details and view the device active state as shown in the Gateway service. + +#### Device Actions + +![Device Actions](<../../.gitbook/assets/Screen Shot 2022-07-19 at 2.42.29 PM.png>) + + + +#### View Details + +![Device Details](<../../.gitbook/assets/Screen Shot 2022-07-19 at 2.44.19 PM.png>) + +Within Device Details, found via the magnifying glass per Inventory row, association to an Entity Parent is possible. Additionally setting the device Firmware policy to inherit the rule assigned based on its membership to a Parent and to require Release Candidates or permit any nightly build upgrade to apply. Additionally the device may be enrolled within RRM should its Entity and Venue membership be part of RRM processing. Device Class determines if the device should be restricted to an Entity, Venue, and an end Subscriber. + +Device-Specific Configuration will expose any overriding configuration data present for this specific device. Device specific configuration will override inherited configurations from lower priority templates. + +Computed Configuration will display the enumeration of all provisioned templates the device is associated with. These templates are inherited as a result of device membership within an Entity, Child Entity, Venue and or Child Venue from which configuration templates may have been defined based on the admin deployment. + + + +### Bulk Inventory API + +The service API could be used to bulk load record formats in a common .csv structure using JSON. For example + +\`\`\` + +"SerialNumber",Name,Description,DeviceType,NoteText for example: d1300f7b0732,Manufacturer,Desc, edgecore\_spw2ac1200,OutdoorAP + +\`\`\` + +For each inventory record, the \`\`\`deviceType\`\`\` must match a valid OpenWiFi device type. For example: + +\`\`\` + +"deviceTypes": \[ "cig\_wf160d", "cig\_wf188", "cig\_wf194c", "edgecore\_eap101", "edgecore\_eap102", + +"edgecore\_ecs4100-12ph", "edgecore\_ecw5211", + +> ...] + +\`\`\` + +When inventory is assigned to a Venue, it can be allocated into a top-level parent such as the operator. Then, based on role access, operation's teams may choose to assign the device to a child entity within an operating division, or setup the device as a tenant of a managed Wi-Fi service for example. + +Choosing to assign the device to a specific MDU location as an example can be done in one step from above. + +## diff --git a/sdk/user-interface/device-provisioning/README.md b/sdk/user-interface/device-provisioning/README.md new file mode 100644 index 0000000..b8ce18c --- /dev/null +++ b/sdk/user-interface/device-provisioning/README.md @@ -0,0 +1,24 @@ +# Provisioning + +The OpenWiFi solution can be applied to a diverse number of use cases from enterprise networks, service provider access, and hotspots. OpenWiFi offers a variety of managed services from small to very large venues of roaming, client shared-key management, client steering, mobile offload, QoS-based services, and Layer 2 and Layer 3 breakout and overlay options. + +The Provisioning service provides a view into the network as a whole, and venues with entity-based control. + +The provisioning service for OpenWiFi supports weighted order inheritance of configuration templates. These services and networks provide the greatest level of flexibility. + +The system functions from a starting point of managed inventory assigned into entities, venues and optionally end subscribers. From this association, inheritance of entity, venue and subscriber configuration becomes possible where one to many configurations are processed including one to one when an inventory device such as a P2P link or Subscriber Gateway have unique operating data. + +These features are present from the service over the web interface as well as via API for controller integration and OSS/BSS integration purposes. + +With template inheritance, the aggregate of all inherited templates in the device association to Entity, Child, Venue, Child, Device Specific is possible. Overlapping configuration is controlled by the inherited template weight. + +### Entities + +Initial deployment of the Provisioning service will have an empty Entities tree. The Top Entity may be used for a number of actions or simply as a description for structure below this level. + +![](<../../../.gitbook/assets/Screen Shot 2022-07-20 at 11.17.56 AM.png>) + +For example, an operator may choose to simply rename this Top Entity as "Operator Name" and set Firmware Upgrade and RRM policies to no actions accordingly. Creating child entities from this point defining perhaps an operational break down such as divisions within the operator, within which setting Firmware and or RRM rules may apply per division is possible. + +![](<../../../.gitbook/assets/Screen Shot 2022-07-20 at 11.17.24 AM.png>) + diff --git a/sdk/user-interface/device-provisioning/creating-entities/README.md b/sdk/user-interface/device-provisioning/creating-entities/README.md new file mode 100644 index 0000000..b7f7ae9 --- /dev/null +++ b/sdk/user-interface/device-provisioning/creating-entities/README.md @@ -0,0 +1,16 @@ +# Creating Entities + +Entities represent a collection of resources for which certain business logic rules apply. + +Entities may hold: + +| Members of Entity | Description | +| ----------------- | -------------------------------------------------------------------------- | +| Entity | A child entity | +| Venue | A logical aggregation of devices, configurations, locations with Analytics | +| Configuration | Provisioning templates | +| Inventory | Device members | +| Locations | Device locations | +| Contacts | Administrative contact information | +| Resources | Global common resources such as RADIUS services | + diff --git a/sdk/user-interface/device-provisioning/creating-entities/configurations/README.md b/sdk/user-interface/device-provisioning/creating-entities/configurations/README.md new file mode 100644 index 0000000..ab5a6b2 --- /dev/null +++ b/sdk/user-interface/device-provisioning/creating-entities/configurations/README.md @@ -0,0 +1,103 @@ +# Configurations + +Device provisioning occurs based on inventory association to configuration templates. + +Creating a template begins with the Configurations tab and creating a new template. + +![](<../../../../../.gitbook/assets/Screen Shot 2022-07-20 at 11.27.42 AM.png>) + +### Create + +Create Configuration dialog requires a name and one or multiple device types to apply configuration with. If device inventory within an Entity or a Venue exist with no configuration templates matching Device Types of the associated inventory, no associated provisioning will apply to those devices. This is the basic logic that enables unique Wi-Fi device type configurations to be layered through the system. + +### + +![](<../../../../../.gitbook/assets/Screen Shot 2022-07-20 at 11.28.28 AM.png>) + +Limiting the configuration to a subset of device types is done through selection of available Device Types via pull down menu. + +![](<../../../../../.gitbook/assets/Screen Shot 2022-07-20 at 11.34.02 AM.png>) + +A possible scenario may be that at such a top level, the operator wishes to set transmit power, MIMO operation where the Wi-Fi 6 2x2 top level configuration is defined. + +To include configuration parameters, select Add Subsection and choose the appropriate values. + +![](<../../../../../.gitbook/assets/Screen Shot 2022-07-20 at 11.36.08 AM.png>) + +In this example we will choose Radios and define the MIMO and Tx Power. + +![](<../../../../../.gitbook/assets/Screen Shot 2022-07-20 at 11.37.22 AM.png>) + +Begin with describing the Radio operating mode, assign a weight that may be either low enough to be overridden by further entity or venues or high enough to not be overridden, then Add Radio. + + + +![](<../../../../../.gitbook/assets/Screen Shot 2022-07-20 at 11.38.58 AM.png>) + +OpenWiFi supports all possible Wi-Fi radio bands. Select the desired radio(s) and continue. + +#### Radio General + +![](<../../../../../.gitbook/assets/Screen Shot 2022-07-20 at 11.40.03 AM.png>) + +General properties, the following may be configured: + +| Option | Description | +| --------------- | ------------------------------------ | +| Band | Frequency Band | +| Bandwidth | 5,10,20 MHz channel narrow operation | +| Country | Operating Country aka Country Code | +| Channel-Mode | Operating Mode HT, VHT, HE | +| Channel-Width | Total channel bandwidth | +| Channel | Operating channel frequency | +| MIMO | Values of 1x1 - 8x8 | +| TX-Power | Transmission power in dBm | +| Legacy-Rates | Allow 802.11b rates | +| Maximum-Clients | Total UEs Permitted | +| Multiple-BSSID | Multiple BSSID IE advertisment | + +#### Radio Advanced + +![](<../../../../../.gitbook/assets/Screen Shot 2022-07-20 at 11.48.24 AM.png>) + +Advanced Settings, the following may be configured: + +| | | +| ----------------- | --------------------------------------------------------------------------------------------------------------------- | +| Beacon-Rate | Value 1-54Mb/s Beacon Frame Rate | +| Beacon-Interval | Interval of Beacon Frames in ms | +| DTIM-Period | Value 1-255 Delivery Traffic Information Message | +| Hostapd-iface-raw | Directly configure hostapd parameters not part of OpenWiFi data model | +| Multicast | Multicast frame rate in Mb/s | +| EMA | Multi-BSSID broadcast using EMA | +| BSS-Color | BSS Coloring 0-disable, 1-63 manual, 64 random | +| Require-Mode | Minimum 802.11 UE standard permitted to associate. None - disabled, HT - a,b,g,n, VHT - a,b,g,n,ac, HE- a,b,g,n,ac,ax | + + + +When complete, Save the "Top Level Wi-Fi 6 2x2" configuration for the device types chosen that align to such a radio mode. + +### Inheriting Advanced Radio Configuration + +For purpose of demonstration, if the admin were to create another Configuration template with the same weight as the previous template defining the Advanced parameters, these could then be broken down for example by device type. + +Create another template as described for only one of the Wi-Fi 6 2x2 APs we have shown thus far. + +![](<../../../../../.gitbook/assets/Screen Shot 2022-07-20 at 12.01.11 PM.png>) + +Setting specific configuration for the EAP 101 advanced radio parameters. For example, if a device in this entity is an EAP 101, it will have advanced radio properties of 12Mb/s beacon rate, 24Mb/s multicast rate, random BSS color and require HE mode. + +![](<../../../../../.gitbook/assets/Screen Shot 2022-07-20 at 12.03.23 PM.png>) + +With these settings saved, multiple configuration templates are now shown that will influence radio operating parameters equally yet separately based on device type. + +![](<../../../../../.gitbook/assets/Screen Shot 2022-07-20 at 12.04.00 PM.png>) + + + + + + + + + diff --git a/sdk/user-interface/device-provisioning/creating-entities/configurations/metrics-settings-example.md b/sdk/user-interface/device-provisioning/creating-entities/configurations/metrics-settings-example.md new file mode 100644 index 0000000..39f5f9c --- /dev/null +++ b/sdk/user-interface/device-provisioning/creating-entities/configurations/metrics-settings-example.md @@ -0,0 +1,34 @@ +# Metrics Settings Example + +A common example is to inherit the desired telemetry for all devices spanning all types, at a top level. + +It remains possible to override the values shown here, perhaps to a faster interval, for the required telemetry data defined at the top level. + + + +### Create Configuration + +Create a general configuration, select Metrics as the Configuration Section. + +![](<../../../../../.gitbook/assets/Screen Shot 2022-07-20 at 1.07.24 PM.png>) + +Within the Subsections select all metrics types to be included and a weight for this template. + +Available metrics: + +| Metric | Description | +| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| WiFi Frames | Select Management Frame reports to send. Values include: Probe, Auth, Assoc, DeAuth, Disassoc, Local-Deauth, Inactive-Deauth, Key-Mismatch, Beacon-Report, Radar-Detected | +| Statistics | Set Interval of all Statistics and types including: SSID, LLDP, Clients | +| DHCP Snooping | Select the DHCP & DHCPv6 frames to send in telemetry including: ACK, DISCOVER, OFFER, REQUEST, REPLY, RENEW, SOLICIT | +| Health | Interval to send automated health check score | + + + + + + + + + + diff --git a/sdk/user-interface/device-provisioning/creating-venues/README.md b/sdk/user-interface/device-provisioning/creating-venues/README.md new file mode 100644 index 0000000..c14efc2 --- /dev/null +++ b/sdk/user-interface/device-provisioning/creating-venues/README.md @@ -0,0 +1,34 @@ +# Creating Venues + +Venues are an important concept in OpenWIFi Provisioning. Venues inherit access to Analytics where incoming telemetry and client events are aggregated from the message bus, transformed and correlated based on the members of the Venue resulting in Venues Dashboard, Live Client quality connection analysis, and client tracking through the venue. + +{% hint style="info" %} +Venues may not exist beneath the root entity. Create an entity prior to defining a venue +{% endhint %} + +### Create a Venue + +Within a non-root entity, Create a Venue. + +![](<../../../../.gitbook/assets/Screen Shot 2022-07-20 at 1.21.43 PM.png>) + +Once the Venue exists, navigate into the Venue. + +### Venue Configurations + +Within a Venue, the RRM and Firmware management rules may be defined. Note Analytics are now an available option within the Venue. To track device and client statistics, enable Analytics. + +![](<../../../../.gitbook/assets/Screen Shot 2022-07-20 at 1.24.18 PM.png>) + +Choose Edit and Start Monitoring. This will enable the admin to determine the interval of analytic data aggregation, and the data retention window in days. + +![](<../../../../.gitbook/assets/Screen Shot 2022-07-20 at 1.25.43 PM.png>) + +When Analytics are enabled, the Dashboard is populated. As devices are associated to the Venue, their telemetry data is aggregated by Analytics service and correlated for display via Dashboard, Live View and Client Lifecycle. + +![](<../../../../.gitbook/assets/Screen Shot 2022-07-20 at 1.29.54 PM.png>) + + + + + diff --git a/sdk/user-interface/device-provisioning/creating-venues/configurations/README.md b/sdk/user-interface/device-provisioning/creating-venues/configurations/README.md new file mode 100644 index 0000000..9518893 --- /dev/null +++ b/sdk/user-interface/device-provisioning/creating-venues/configurations/README.md @@ -0,0 +1,6 @@ +# Configurations + +Within the example Venue, creating configuration templates for SSIDs and or other configuration sections are possible. These configurations are inherited by device memberships at the Venue level. + +It is therefore possible to define many Venues, Child Venues, and Inventory associations that will then inherit global templates from entities in addition to aggregation of Venue templates. + diff --git a/sdk/user-interface/device-provisioning/creating-venues/configurations/vap-ssid.md b/sdk/user-interface/device-provisioning/creating-venues/configurations/vap-ssid.md new file mode 100644 index 0000000..8f6e68e --- /dev/null +++ b/sdk/user-interface/device-provisioning/creating-venues/configurations/vap-ssid.md @@ -0,0 +1,41 @@ +# VAP - SSID + +An SSID may be associated to any defined interface. This association ties the dataplane of the VAP together with the underlying interface services. + +Most common SSID configuration parameters have been exposed via the Provisioning UI. Consult the OpenWiFi data model for the full list of available configurations. + +From an interface select Add SSID. + +![](<../../../../../.gitbook/assets/Screen Shot 2022-07-20 at 4.54.58 PM.png>) + +Assigning the name of the SSID is also the name of the Wi-Fi network itself. Operating band of the SSID is configurable by radio. + +#### SSID Configuration Options + +| Option | Description | +| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | SSID name | +| BSS-Mode |

Operating mode of the wireless interface
Options: ap, sta, mesh, wds-ap, wds-sta

| +| WiFi-Bands | Radio selection(s) of the SSID | +| Authentication Protocol |

Wireless encryption of the BSS
Options: None, WPA-PSK, WPA2-PSK, PSK2-RADIUS, WPA-PSK/WPA2-PSK Personal Mixed, WPA-Enterprise, WPA2-Enterprise EAP-TLS, WPA-Enterprise-Mixed, SAE, WPA2/WPA3 Transitional, WPA3-Enterprise EAP-TLS, WPA3-192-Enterprise EAP-TLS

| +| Authentication Key | Pre-Share dKey (when applicable) | +| Authentication IEEE80211w |

Management Frame Protection
Options: disabled, optional, required

| +| Advanced | | +| Hidden-SSID | Disable Beacon Frame Broadcast | +| Services | Services associated to the SSID logical interface | +| Maximum-Clients | Total associations permitted to the SSID | +| Purpose |

Role the SSID performs
Options: Default, Onboarding-AP, Onboarding-sta

| +| Isolate-Clients | BSS client isolation | +| Power-Save | Unscheduled Automatic Power Save Delivery | +| Broadcast-Time | Beacon Time Broadcast | +| Unicast-Conversion | Convert Multicast to Unicast over BSS | +| Proxy-ARP | BSS respond to host ARP on behalf of another client | +| Disassoc-Low-Ack | Disassociate stations based on excessive transmission failures or other indications of connection loss | +| Vendor-Elements | This option allows embedding custom vendor specific IEs inside the beacons of a BSS in AP mode. | +| Multi-PSK | Per device shared key to associate with unique VLAN | +| Rate Limit | Ingress-rate and Egress-rate in Mb/s | +| RRM |

Neighbor reporting
LCI measurement element content
Civic-Location element content
FTM-Responder Fine Timing Measurement
Stationary-AP

| +| Roaming |

Message-Exchange
Generate PSK
Domain-Identifier
PMK-R0-Key-Holder
PMK-R1-Key-Holder

| + + + diff --git a/sdk/user-interface/device-provisioning/creating-venues/configurations/wan.md b/sdk/user-interface/device-provisioning/creating-venues/configurations/wan.md new file mode 100644 index 0000000..c002c8c --- /dev/null +++ b/sdk/user-interface/device-provisioning/creating-venues/configurations/wan.md @@ -0,0 +1,22 @@ +# WAN + +Configure WAN interface as an upstream interface role type. + +OpenWiFi has the concept of a virtual dataplane where the definition of the interface role as upstream or downstream defines if the port involved will be mapped to WAN or LAN operation. + +It is possible to re-map any LAN port to function as a normal WAN port in this way. + +![](<../../../../../.gitbook/assets/Screen Shot 2022-07-20 at 1.37.02 PM.png>) + +When the above Interfaces configuration section is created, respond to the dialog prompt to define an upstream WAN then select from the available configuration options to suit the local environment. + +![](<../../../../../.gitbook/assets/Screen Shot 2022-07-20 at 1.38.22 PM.png>) + +Within WAN(upstream) select the port(s) for use as WAN. + +A variety of Services features may be associated to logical interfaces. For this example, enable LLDP. + +IP Addressing set as IPv4 Dynamic will cause the WAN port to use DHCP for its provisioned internet access. IPv6 dual stack is also supported. + + + diff --git a/sdk/user-interface/devices-view/README.md b/sdk/user-interface/devices-view/README.md new file mode 100644 index 0000000..a464d4f --- /dev/null +++ b/sdk/user-interface/devices-view/README.md @@ -0,0 +1,58 @@ +--- +description: OpenWiFi 2.0 SDK +--- + +# Devices + +Each device presents Metrics and Health check data to the Gateway. Devices view displays this information in the following organization: + +* Status +* Configuration +* Logs +* Health +* Commands +* Statistics +* Command History + +![Initial Device View](<../../../.gitbook/assets/Screen Shot 2021-07-28 at 5.15.03 PM (1).png>) + +## Status + +Connection status reflects the Gateway to Device current communications status. Uptime and Last Contact reflect communication state. Load indicates processing load on the device. Memory Used indicates free memory on the device. + +![Device Status](<../../../.gitbook/assets/Screen Shot 2021-07-28 at 5.17.59 PM.png>) + +## Configuration + +Device UUID, Serial Number, MAC Address and Device Type are displayed. Last configuration update date and timestamp reflects the last time a "configure" action completed on the device. Password may be set and device notes may be added. + +![Device view Configuration Panel](<../../../.gitbook/assets/Screen Shot 2021-07-28 at 5.21.07 PM.png>) + +## Logs + +Log history of the device is presented within Logs. Expand the tile selecting the down arrow. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-28 at 5.25.29 PM (1).png>) + +## Health + +Health score is an active tile reflecting the device health out of a score reported by the device to Gateway. Health metrics are configured on the device based on chosen data model options. When the device falls out of 100%, this tile changes to red. Expanding the tile will present all health reports. Those with less than 100% score will contain reasons for the result from this interface. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-28 at 5.24.00 PM.png>) + +## Commands + +Commands tile provides a number of administrative actions for the user: + +| Command | Action | +| ---------------- | ------------------------------------------------------- | +| Reboot | Warm Restart remote device | +| Firmware Upgrade | Initiate firmware upgrade process | +| WiFi Scan | Initiate remote scan of surrounding Wi-Fi | +| Connect | Initiate an rTTY Remote Shell session | +| Blink | Set LEDs to On, Off or Blinking state | +| Trace | Initiate a remote Packet Capture | +| Factory Reset | Hard Reset remote device - destroys device local config | +| Configure | Upload Device Configuration | + +![Commands Tile](<../../../.gitbook/assets/Screen Shot 2021-07-28 at 5.25.50 PM.png>) diff --git a/sdk/user-interface/devices-view/command-history.md b/sdk/user-interface/devices-view/command-history.md new file mode 100644 index 0000000..cca5b9f --- /dev/null +++ b/sdk/user-interface/devices-view/command-history.md @@ -0,0 +1,25 @@ +--- +description: OpenWiFi SDK 2.0 +--- + +# Command History + +Multiple events are recorded in the Command History tile. Each line item will have a Result, Details, and Delete action. + +![Command History Tile](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 3.10.22 PM.png>) + +When an rTTY session is executed, this is a displayed command history. Selecting the Result icons will display the Success or Fail of the command. + +![rTTY Command History](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 3.12.02 PM.png>) + +Each provisioning event is reflected as a configure command history. To see the entire JSON payload and the result, including success or error with message, simply select Details to expand the dialog below with this data. A date and time in the third column indicates when the configure command was executed successfully. + +![Configure Command History](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 3.12.27 PM.png>) + +If a provisioning event has failed to complete, its command history for configure will show as pending. + +![configure Pending Command History](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 3.18.12 PM.png>) + +Remote packet capture is shown as the trace command history. When packet captures are persisted in the OpenWiFi SDK, they may be downloaded again through the cloud download icon. + +![trace Command History](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 3.16.52 PM.png>) diff --git a/sdk/user-interface/devices-view/commands.md b/sdk/user-interface/devices-view/commands.md new file mode 100644 index 0000000..41f8d0d --- /dev/null +++ b/sdk/user-interface/devices-view/commands.md @@ -0,0 +1,69 @@ +--- +description: OpenWiFi 2.0 SDK +--- + +# Commands + +Within the devices view, the Commands tile offers a number of features and administrative actions. Each of these represent API calls exposed on the OpenAPI northbound interface from the SDK. + +## Reboot + +Selecting the Reboot action will prompt the below dialog. Options presented permit an immediate reboot or a scheduled reboot based on date and time. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 2.25.03 PM (1).png>) + +## Firmware Upgrade + +Multiple methods exist to execute a remote Firmware Upgrade of a device. When selecting Firmware Upgrade via the Commands tile, a simple dialog to upgrade immediately or at a scheduled time is presented. Alternatively using the Firmware Management Service provides a complete solution including managed access to all TIP firmware images. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 2.28.44 PM.png>) + +## Wi-Fi Scan + +OpenWiFi devices may perform channel scanning and return this neighbor and RF data to the SDK in an on demand or ongoing manner. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 2.31.03 PM (1).png>) + +### Wi-Fi Scan Results + +Scan operations function over all channels. If 5GHz channels do not display in the returned results ( either via the UI or over API ) this indicates the device is configured in a DFS channel for which it may not return survey scans at this time. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 2.33.58 PM (1).png>) + +## Connect + +OpenWiFi enables remote connection to any managed device using rTTY encrypted shell session. Selecting Connect will cause a browser tab to open with the login session to current device. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 2.35.48 PM.png>) + +## Blink + +To assist with remote identification of devices in the network, it is possible to turn the LED lights On, Off, of continuous blinking. This may be run on-demand or scheduled. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 2.37.30 PM.png>) + +## Trace + +Trace feature enables a remote packet capture to occur on the managed device, over a specified period of time or amount of traffic, returning the "pcap" packet capture file locally to the OpenWiFi admin user. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 2.39.24 PM.png>) + +Once complete the user is asked to open or save the packet capture file locally. + +![](<../../../.gitbook/assets/image (33) (1).png>) + +## Factory Reset + +It is possible to revert a device to initial out of box state from the OpenWiFi SDK. Sending a Factory Reset will remove all configuration on the device and optionally reset the discovered cloud stored as the 'Redirector' in the device configuration. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 2.46.29 PM (1).png>) + +{% hint style="info" %} +Note: When Redirector is not kept, devices will re-contact the Certificate Authority to re-discover their OpenWiFi cloud address +{% endhint %} + +## Configure + +Prior to the introduction of OpenWiFi 2.0 Provisioning Service, device configuration is done through creation of the JSON provisioning file and either loading that file or applying its contents using the dialog presented via Configure. The same options exist when using the API directly. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 2.48.31 PM (1).png>) diff --git a/sdk/user-interface/devices-view/statistics.md b/sdk/user-interface/devices-view/statistics.md new file mode 100644 index 0000000..80a4e12 --- /dev/null +++ b/sdk/user-interface/devices-view/statistics.md @@ -0,0 +1,37 @@ +--- +description: OpenWiFi 2.0 SDK +--- + +# Statistics + +Each device page presents statistics in traffic terms per interface as a line graph of bandwidth over time. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 2.52.10 PM.png>) + +The generated image may be downloaded for offline use. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 2.53.14 PM.png>) + +Accessing Wi-Fi Analysis and Last Statistics may be found at the top right of Statistics tile. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 3.06.20 PM.png>) + +## Wi-Fi Analysis + +Operating channels, channel width, noise floor and transmit power are the first values reported in Radios table. + +Viewing associations, from the Associations table, and their use is important in terms of bandwidth and connection quality. Wi-Fi Analysis helps visualize each client association, this could be an end user device or a WDS or Mesh association. + +Each association is known by their MAC address or BSSID value. The mode of connection will indicate if an end user client device entering the "ap" or if a client is associated as "wds" or "mesh. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 2.57.34 PM.png>) + +The access point view of RSSI, Rx and Tx Rate, Modulation Coding Scheme and Number of Spatial Streams are exposed for each association. + +Using the slider along the top, the last 15 to 30 minutes of performances data may be viewed. + +## Latest Statistics + +The option to view Latest Statistics is at time of the MVP release, intended to help the Community see on a per device basis how much, or how little depending on device configuration, is being sent to the OpenWiFi Gateway in terms of telemetry. + +![](<../../../.gitbook/assets/Screen Shot 2021-07-29 at 3.04.42 PM.png>) diff --git a/sdk/user-interface/firmware.md b/sdk/user-interface/firmware.md new file mode 100644 index 0000000..b5a0ef3 --- /dev/null +++ b/sdk/user-interface/firmware.md @@ -0,0 +1,35 @@ +--- +description: OpenWiFi 2.0 SDK +--- + +# Firmware + +Firmware management service integrates across all OpenWiFi Gateways deployed in a cluster enabling updates to running firmware either from the latest published version, or any other released version. + +## Dashboard + +Firmware dashboard provides a single view for overall health of deployed device firmware. Latest firmware charts, device firmware version distribution, distribution of device by type and current connected devices. + +![Firmware Dashboard](<../../.gitbook/assets/Screen Shot 2021-08-01 at 12.07.27 PM.png>) + +## Device Table + +From the Devices table, any device with a newer firmware published by TIP OpenWiFi is indicated with a yellow icon. Selecting this icon presents the option to upgrade to latest or specify which firmware to use. + +![Firmware Control in Device Table](<../../.gitbook/assets/Screen Shot 2021-08-01 at 12.08.45 PM.png>) + +When the upgrade has been sent successfully, a green Success dialog will display in the upper right on the screen. Devices with latest firmware version will show a green firmware icon in the Devices row. + +## Firmware Management Service + +Viewing the contents of Firmware Management Service is available from the left navigation, select Firmware. + +Once in Firmware, it is possible to search by device model for all known firmware revisions. + +![Firmware Management Service](<../../.gitbook/assets/Screen Shot 2021-07-29 at 4.43.57 PM.png>) + +If in the Device Table reference above, instead of selecting Upgrade to Latest, the specific URI location of any available firmware is found using the Firmware table. + +Selecting Details will present information for any firmware row, including the URI which may be copied into the Choose Custom Firmware dialog prompt accordingly. + +![Firmware Entry Details](<../../.gitbook/assets/Screen Shot 2021-07-29 at 4.46.01 PM.png>) diff --git a/sdk/user-interface/gateway.md b/sdk/user-interface/gateway.md new file mode 100644 index 0000000..9a9d026 --- /dev/null +++ b/sdk/user-interface/gateway.md @@ -0,0 +1,69 @@ +# Gateway + +![](../../.gitbook/assets/image12.jpeg) + +The OpenWiFi solution can be applied to a diverse number of use cases from enterprise networks, service provider access, and hotspots. OpenWiFi offers a variety of managed services from small to very large venues of roaming, client shared-key management, client steering, mobile offload, QoS-based services, and Layer 2 and Layer 3 breakout and overlay options. The Provisioning service provides a view into the network as a whole, and venues with entity-based control. + +The provisioning service for OpenWiFi supports weighted order inheritance of configuration templates. These services and networks provide the greatest level of flexibility. + +The system functions from a starting point of managed inventory assigned to entities, venues and optionally end subscribers. From this association, inheritance of entity, venue and subscriber configuration becomes possible where one to many configurations are processed including one to one when an inventory device such as a P2P link or Subscriber Gateway have unique operating data. + +These features are present from the service over the web interface as well as via API for controller integration and OSS/BSS integration purposes. + +Device provisioning is highly configurable and scalable. + +## Inventory + +You can manage device inventory for both assigned and unassigned states. As devices are added to the system, they become available to venues for association and service provisioning. + +Each inventory record, regardless of assignment state can be viewed in the OpenWifi dashboard. + +{width="6.4in" height="3.0in"}Use the SDK UI to assign a device to a venue, review device configurations, update record tags or delete a device. + +![](../../.gitbook/assets/image14.png) + +### Bulk Inventory API + +The TIP OpenWiFi inventory service API could be used to bulk load record formats in a common .csv structure using JSON. For example + +\`\`\` + +"SerialNumber",Name,Description,DeviceType,NoteText for example: d1300f7b0732,Manufacturer,Desc, edgecore\_spw2ac1200,OutdoorAP + +\`\`\` + +For each inventory record, the \`\`\`deviceType\`\`\` must match a valid OpenWiFi device type. For example: + +\`\`\` + +"deviceTypes": \[ "cig\_wf160d", "cig\_wf188", "cig\_wf194c", "edgecore\_eap101", "edgecore\_eap102", + +"edgecore\_ecs4100-12ph", "edgecore\_ecw5211", + +> ...] + +\`\`\` + +When inventory is assigned to a venue, it can be allocated into a top-level parent such as the operator. Then, based on role access, operation's teams may choose to assign the device to a child entity within an operating division, or setup the device as a tenant of a managed Wi-Fi service for example. + +Choosing to assign the device to a specific MDU location as an example can be done in one step from above. + +## Creating Entities and Venues + +Devices can be assigned to the MDU—which may be an actual venue such as a building or a tenant operator with child venues. + +![](../../.gitbook/assets/image15.jpeg) + +![](../../.gitbook/assets/image16.png) + +## Provisioning Templates + +Use the Create Configuration window to create a configuration template for a specific venue or device. + +![](../../.gitbook/assets/image17.png) + +![](../../.gitbook/assets/image18.png) + +![](../../.gitbook/assets/image19.png) + +For example, a configuration template for a local area network could include: address translation and local DHCP for on-premises devices, WAN interface with DHCP for IPv4/IPv6 service, and a basic Wi-Fi configuration. diff --git a/sdk/user-interface/inventory-association.md b/sdk/user-interface/inventory-association.md new file mode 100644 index 0000000..2a3da44 --- /dev/null +++ b/sdk/user-interface/inventory-association.md @@ -0,0 +1,6 @@ +# Inventory Association + +Within a Venue, devices inherit the sum of Configurations present in the Venue, and Entity structure holding the Venue matching their device type. + + +