Commit e7016f79b39b8b2800cad78180806b62d4a39de6

Authored by Etienne Pallier
1 parent 35a2d21d
Exists in dev

cleanup Dockerfile et docker-compose

@@ -58,13 +58,6 @@ old/ @@ -58,13 +58,6 @@ old/
58 58
59 out.* 59 out.*
60 60
61 -OLD/*  
62 -*_OLD*  
63 -*_ORIG*  
64 -*.ORIG  
65 -TMP/*  
66 -  
67 -client.log  
68 61
69 docker/*.env 62 docker/*.env
70 63
@@ -102,5 +95,18 @@ TOKEN @@ -102,5 +95,18 @@ TOKEN
102 *.modif.* 95 *.modif.*
103 *.moi 96 *.moi
104 *.moi.* 97 *.moi.*
  98 +*.me.*
  99 +*.me
  100 +*.me?
  101 +*.old
  102 +*.OLD
  103 +OLD/*
  104 +*_OLD*
  105 +*_ORIG*
  106 +*.ORIG
  107 +*.ORIG?
  108 +TMP/*
  109 +___*
  110 +client.log
105 111
106 #privatedev/plugin/agent/triton/triton/CATALOGUES 112 #privatedev/plugin/agent/triton/triton/CATALOGUES
@@ -68,7 +68,7 @@ RUN cd /usr/bin && ln -s python3 python @@ -68,7 +68,7 @@ RUN cd /usr/bin && ln -s python3 python
68 #RUN apt-get install -y python3-pip 68 #RUN apt-get install -y python3-pip
69 RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10 69 RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10
70 #RUN pip3 install --upgrade pip 70 #RUN pip3 install --upgrade pip
71 -RUN python3.10 -m pip install --upgrade pip 71 +RUN python3 -m pip install --upgrade pip
72 72
73 73
74 74
@@ -155,11 +155,11 @@ CMD ["x11vnc", "-create", "-forever"] @@ -155,11 +155,11 @@ CMD ["x11vnc", "-create", "-forever"]
155 155
156 156
157 157
158 -  
159 -  
160 # Get IRAP self signed certificate 158 # Get IRAP self signed certificate
161 RUN echo | openssl s_client -connect gitlab.irap.omp.eu:443 -servername gitlab.irap.omp.eu 2>/dev/null | openssl x509 > /etc/ssl/certs/gitlab.irap.omp.eu.crt 159 RUN echo | openssl s_client -connect gitlab.irap.omp.eu:443 -servername gitlab.irap.omp.eu 2>/dev/null | openssl x509 > /etc/ssl/certs/gitlab.irap.omp.eu.crt
162 160
  161 +
  162 +
163 ################################# 163 #################################
164 # PyROS user (better than root) # 164 # PyROS user (better than root) #
165 ################################# 165 #################################
@@ -178,8 +178,6 @@ USER pyros_user @@ -178,8 +178,6 @@ USER pyros_user
178 # TODO: pourquoi numpy ??? A virer ? 178 # TODO: pourquoi numpy ??? A virer ?
179 #RUN pip install --user numpy 179 #RUN pip install --user numpy
180 180
181 -  
182 -  
183 # Copy local host machine files to image 181 # Copy local host machine files to image
184 COPY --chown=pyros_user:pyros_user . . 182 COPY --chown=pyros_user:pyros_user . .
185 # Copy some aliases 183 # Copy some aliases
@@ -190,9 +188,12 @@ RUN cp .bash_aliases .. @@ -190,9 +188,12 @@ RUN cp .bash_aliases ..
190 # Adding local/bin to path to avoid pip warning 188 # Adding local/bin to path to avoid pip warning
191 ENV PATH "$PATH:/home/pyros_user/.local/bin" 189 ENV PATH "$PATH:/home/pyros_user/.local/bin"
192 190
  191 +
193 # Installing click on the image to prevent error on the first execution of the installation script 192 # Installing click on the image to prevent error on the first execution of the installation script
194 -RUN python3.10 -m pip install --user click  
195 -RUN python3.10 -m pip install --user setuptools==58 193 +RUN python3 -m pip install --user click
  194 +
  195 +RUN python3 -m pip install --user setuptools==58
  196 +
196 # (EP 23/3/2022) Installing pip-tools for the management of all the requirements*.txt files (python dependencies packages) 197 # (EP 23/3/2022) Installing pip-tools for the management of all the requirements*.txt files (python dependencies packages)
197 # NB : 198 # NB :
198 # - pip-tools generates a smarter and smaller requirements.txt file than the traditional "pip freeze" 199 # - pip-tools generates a smarter and smaller requirements.txt file than the traditional "pip freeze"
@@ -200,14 +201,14 @@ RUN python3.10 -m pip install --user setuptools==58 @@ -200,14 +201,14 @@ RUN python3.10 -m pip install --user setuptools==58
200 # - Unfortunatly, it is difficult to use with several requirements*.txt files as it is the case for this software : pyros + sphinx + guitastro... 201 # - Unfortunatly, it is difficult to use with several requirements*.txt files as it is the case for this software : pyros + sphinx + guitastro...
201 # - So we cannot yet use it completely and still have to use the traditional "pip install -r" anyway ... 202 # - So we cannot yet use it completely and still have to use the traditional "pip install -r" anyway ...
202 # - But we can at least use it to generate all the requirements*.txt files in a far better format 203 # - But we can at least use it to generate all the requirements*.txt files in a far better format
203 -RUN python3.10 -m pip install --user pip-tools 204 +RUN python3 -m pip install --user pip-tools
204 205
205 # Installing packages required for Guitastro 206 # Installing packages required for Guitastro
206 RUN pip-compile ./vendor/guitastro/install/requirements.in 207 RUN pip-compile ./vendor/guitastro/install/requirements.in
207 -RUN python3.10 -m pip install --user -r ./vendor/guitastro/install/requirements.txt 208 +RUN python3 -m pip install --user -r ./vendor/guitastro/install/requirements.txt
208 # Maybe unnecessary because same requirements as for pyros requirements_dev (?) 209 # Maybe unnecessary because same requirements as for pyros requirements_dev (?)
209 #RUN pip install --user -r ./vendor/guitastro/install/requirements_dev.txt 210 #RUN pip install --user -r ./vendor/guitastro/install/requirements_dev.txt
210 211
211 # Installing packages required for PyROS 212 # Installing packages required for PyROS
212 -RUN python3.10 -m pip install --user -r ./install/requirements.txt  
213 -RUN python3.10 -m pip install --user -r ./install/requirements_dev.txt 213 +RUN python3 -m pip install --user -r ./install/requirements.txt
  214 +RUN python3 -m pip install --user -r ./install/requirements_dev.txt
docker/PYROS_DOCKER_INSTALL
1 #!/usr/bin/env bash 1 #!/usr/bin/env bash
2 2
3 # if no container is running 3 # if no container is running
4 -if ! [ $(docker ps | grep 'pyros' | wc -l) -eq 4 ]  
5 -then 4 +if ! [ $(docker ps | grep 'pyros' | wc -l) -eq 4 ] ; then
6 echo "pyros-db or pyros weren't running, starting them..." 5 echo "pyros-db or pyros weren't running, starting them..."
7 ./PYROS_DOCKER_START.bat 6 ./PYROS_DOCKER_START.bat
8 fi 7 fi
9 8
10 # while db container isn't ready to execute queries, wait 5 seconds 9 # while db container isn't ready to execute queries, wait 5 seconds
11 -if ! docker inspect pyros-db --format='{{.State.Health.Status}}' | grep -q 'healthy'  
12 -then 10 +#if ! docker inspect pyros-db --format='{{.State.Health.Status}}' | grep -q 'healthy' ; then
  11 +#fi
  12 +while ! docker inspect pyros-db --format='{{.State.Health.Status}}' | grep -q 'healthy' ; do
13 echo "db service isn't ready yet, waiting until it's ready..." 13 echo "db service isn't ready yet, waiting until it's ready..."
14 -fi  
15 -while ! docker inspect pyros-db --format='{{.State.Health.Status}}' | grep -q 'healthy'  
16 -do  
17 sleep 5 14 sleep 5
18 heal_status=$(docker inspect pyros-db --format='{{.State.Health.Status}}') 15 heal_status=$(docker inspect pyros-db --format='{{.State.Health.Status}}')
19 echo "Current status : $heal_status" 16 echo "Current status : $heal_status"
20 done 17 done
21 18
22 -# db container is ready to execture queries, we can start the installation 19 +# db container is ready to execture queries
  20 +# We can now start the installation
23 docker-compose exec pyros python3 pyros.py install 21 docker-compose exec pyros python3 pyros.py install
24 22
docker/PYROS_DOCKER_RUN_WEBSERVER_ONLY
1 #!/usr/bin/env bash 1 #!/usr/bin/env bash
2 2
3 #if no container is running 3 #if no container is running
4 -if ! [ $(docker ps | grep 'pyros' | wc -l) -eq 4 ]  
5 -then 4 +if ! [ $(docker ps | grep 'pyros' | wc -l) -eq 4 ] ; then
6 echo "pyros-db or pyros weren't running, starting them..." 5 echo "pyros-db or pyros weren't running, starting them..."
7 ./PYROS_DOCKER_START.bat 6 ./PYROS_DOCKER_START.bat
8 fi 7 fi
9 -docker-compose exec pyros python3 pyros.py -d start webserver $@ 8 +
  9 +docker compose exec pyros python3 pyros.py -d start webserver $@
  10 +#docker-compose exec pyros python3 pyros.py -d start webserver $@
  11 +#docker compose exec pyros python3 pyros.py -d start -o tnc -fg webserver $@
10 #docker exec -it pyros python3 pyros.py start webserver $@ 12 #docker exec -it pyros python3 pyros.py start webserver $@
11 #docker exec -it pyros python3 pyros.py -d start -o tnc webserver $@ 13 #docker exec -it pyros python3 pyros.py -d start -o tnc webserver $@
docker/docker-compose.yml
1 version: "3.9" 1 version: "3.9"
2 2
3 services: 3 services:
  4 +
  5 + #######################
  6 + # MYSQL - DBMS
  7 + #######################
4 db: 8 db:
5 # if we're using mysql >= 8, some of sql queries aren't valid anymore, like for creating and grant an user at the same time 9 # if we're using mysql >= 8, some of sql queries aren't valid anymore, like for creating and grant an user at the same time
6 # This is fixed in pyros.py 10 # This is fixed in pyros.py
  11 + container_name: pyros-db
7 image: mysql:8.0.28 12 image: mysql:8.0.28
8 - command: --default-authentication-plugin=mysql_native_password  
9 restart: always 13 restart: always
  14 + command: --default-authentication-plugin=mysql_native_password
  15 + environment:
  16 + # note : as db is an image of mysql, this root password will be set on the first installation on the image, if the value is changed, it will not be updated in the database
  17 + - "MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-root}"
  18 + - VNC_NO_PASSWORD=1
  19 + volumes:
  20 + - db:/var/lib/mysql/
10 deploy: 21 deploy:
11 restart_policy: 22 restart_policy:
12 condition: on-failure 23 condition: on-failure
@@ -15,29 +26,26 @@ services: @@ -15,29 +26,26 @@ services:
15 limits: 26 limits:
16 cpus: '0.5' 27 cpus: '0.5'
17 memory: 1GB 28 memory: 1GB
18 - #pids: 1  
19 - container_name: pyros-db  
20 - environment:  
21 - # note : as db is an image of mysql, this root password will be set on the first installation on the image, if the value is changed, it will not be updated in the database  
22 - - "MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-root}"  
23 - - VNC_NO_PASSWORD=1  
24 - volumes:  
25 - - db:/var/lib/mysql/ 29 + #pids: 1
26 # create network to allow images to communicate with other images within the same network 30 # create network to allow images to communicate with other images within the same network
27 # networks: 31 # networks:
28 # pyros-network: 32 # pyros-network:
29 # ipv4_address: 172.19.0.2 33 # ipv4_address: 172.19.0.2
30 -  
31 healthcheck: 34 healthcheck:
32 test: ["CMD", 'mysqladmin', 'ping', '-h', 'db', '-u', 'root', '-p$$MYSQL_ROOT_PASSWORD' ] 35 test: ["CMD", 'mysqladmin', 'ping', '-h', 'db', '-u', 'root', '-p$$MYSQL_ROOT_PASSWORD' ]
33 timeout: 10s 36 timeout: 10s
34 interval: 5s 37 interval: 5s
35 retries: 20 38 retries: 20
36 39
  40 + ######################################################
  41 + # REDIS - in memory communication bus (for websockets)
  42 + ######################################################
37 redis: 43 redis:
38 container_name: pyros-redis 44 container_name: pyros-redis
39 image: redis:latest 45 image: redis:latest
40 restart: always 46 restart: always
  47 + ports:
  48 + - "6379:6379"
41 deploy: 49 deploy:
42 restart_policy: 50 restart_policy:
43 condition: on-failure 51 condition: on-failure
@@ -46,9 +54,7 @@ services: @@ -46,9 +54,7 @@ services:
46 limits: 54 limits:
47 cpus: '1' 55 cpus: '1'
48 memory: 1GB 56 memory: 1GB
49 - #pids: 1  
50 - ports:  
51 - - "6379:6379" 57 + #pids: 1
52 healthcheck: 58 healthcheck:
53 test: ["CMD", "redis-cli","ping"] 59 test: ["CMD", "redis-cli","ping"]
54 timeout: 10s 60 timeout: 10s
@@ -58,22 +64,19 @@ services: @@ -58,22 +64,19 @@ services:
58 # pyros-network: 64 # pyros-network:
59 # ipv4_address: 172.19.0.5 65 # ipv4_address: 172.19.0.5
60 66
61 - # Service image of python, that lets users interact with python scripts such as pyros. 67 + ######################################################
  68 + # PYROS (main image : docker_pyros) => defined in Dockerfile
  69 + # Ubuntu OS with Python3 and PyROS requirements installed
  70 + # PyROS will later be installed on this image with "pyros.py install" (PYROS_DOCKER_INSTALL)
  71 + ######################################################
62 pyros: 72 pyros:
  73 + container_name: pyros
  74 + restart: always
63 #read_only: true 75 #read_only: true
64 # app/pyros is equivalent to your PYROS_SOFT/PYROS/ directory 76 # app/pyros is equivalent to your PYROS_SOFT/PYROS/ directory
65 # Change "pyros" to whatever you want for the PYROS/ dir name (if you do not want "PYROS") 77 # Change "pyros" to whatever you want for the PYROS/ dir name (if you do not want "PYROS")
66 working_dir: 78 working_dir:
67 /home/pyros_user/app/pyros 79 /home/pyros_user/app/pyros
68 - deploy:  
69 - restart_policy:  
70 - condition: on-failure  
71 - max_attempts: 5  
72 - resources:  
73 - limits:  
74 - cpus: '1'  
75 - memory: 8GB  
76 - #pids: 1  
77 # path to the Dockerfile of this image 80 # path to the Dockerfile of this image
78 environment: 81 environment:
79 # environment variables only for Docker 82 # environment variables only for Docker
@@ -93,7 +96,6 @@ services: @@ -93,7 +96,6 @@ services:
93 uid: ${CURRENT_UID} 96 uid: ${CURRENT_UID}
94 context: .. 97 context: ..
95 #filename: Dockerfile 98 #filename: Dockerfile
96 - container_name: pyros  
97 hostname: ${COMPUTER_HOSTNAME} 99 hostname: ${COMPUTER_HOSTNAME}
98 # tty is the -t option in docker exec 100 # tty is the -t option in docker exec
99 tty: true 101 tty: true
@@ -112,28 +114,47 @@ services: @@ -112,28 +114,47 @@ services:
112 links: 114 links:
113 - db 115 - db
114 - redis 116 - redis
  117 + deploy:
  118 + restart_policy:
  119 + condition: on-failure
  120 + max_attempts: 5
  121 + resources:
  122 + limits:
  123 + cpus: '1'
  124 + memory: 8GB
  125 + #pids: 1
115 # create network to allow images to communicate with other images within the same network 126 # create network to allow images to communicate with other images within the same network
116 # networks: 127 # networks:
117 # pyros-network: 128 # pyros-network:
118 # ipv4_address: 172.19.0.3 129 # ipv4_address: 172.19.0.3
119 #ipv4_address: "${IP_PYROS_USER}" 130 #ipv4_address: "${IP_PYROS_USER}"
120 - restart: always  
121 healthcheck: 131 healthcheck:
122 test: ["CMD", "python3","-V"] 132 test: ["CMD", "python3","-V"]
123 timeout: 10s 133 timeout: 10s
124 interval: 5s 134 interval: 5s
125 retries: 20 135 retries: 20
126 136
127 - 137 + ######################################################
  138 + # PHPMYADMIN (to interact manually with mysql db)
  139 + # (dev only)
  140 + ######################################################
128 phpmyadmin: 141 phpmyadmin:
129 - image: phpmyadmin/phpmyadmin  
130 container_name: pyros-pma 142 container_name: pyros-pma
  143 + image: phpmyadmin/phpmyadmin
  144 + restart: always
131 links: 145 links:
132 - db 146 - db
133 environment: 147 environment:
134 PMA_HOST: db 148 PMA_HOST: db
135 PMA_PORT: 3306 149 PMA_PORT: 3306
136 PMA_ARBITRARY: 1 150 PMA_ARBITRARY: 1
  151 + env_file:
  152 + - .env
  153 + # networks:
  154 + # pyros-network:
  155 + # ipv4_address: 172.19.0.4
  156 + ports:
  157 + - "${PHPMYADMIN_PORT:-8081}:80"
137 deploy: 158 deploy:
138 restart_policy: 159 restart_policy:
139 condition: on-failure 160 condition: on-failure
@@ -143,15 +164,6 @@ services: @@ -143,15 +164,6 @@ services:
143 cpus: '1' 164 cpus: '1'
144 memory: 1GB 165 memory: 1GB
145 #pids: 1 166 #pids: 1
146 -  
147 - env_file:  
148 - - .env  
149 - restart: always  
150 - # networks:  
151 - # pyros-network:  
152 - # ipv4_address: 172.19.0.4  
153 - ports:  
154 - - "${PHPMYADMIN_PORT:-8081}:80"  
155 healthcheck: 167 healthcheck:
156 test: ["CMD", 'mysqladmin', 'ping', '-h', 'db', '-u', 'root', '-p$$MYSQL_ROOT_PASSWORD' ] 168 test: ["CMD", 'mysqladmin', 'ping', '-h', 'db', '-u', 'root', '-p$$MYSQL_ROOT_PASSWORD' ]
157 timeout: 10s 169 timeout: 10s
@@ -159,12 +171,16 @@ services: @@ -159,12 +171,16 @@ services:
159 retries: 20 171 retries: 20
160 172
161 173
162 -  
163 -# declaring volumes 174 +######################################################
  175 +# Declaring volumes
  176 +######################################################
164 volumes: 177 volumes:
165 db: 178 db:
166 driver: local 179 driver: local
167 -# declaring networks 180 +
  181 +######################################################
  182 +# Declaring networks
  183 +######################################################
168 # networks: 184 # networks:
169 # pyros-network: 185 # pyros-network:
170 # #bridge is the default network driver 186 # #bridge is the default network driver
src/core/pyros_django/majordome/doc/AgentMajordome_object_diag.pu deleted
@@ -1,220 +0,0 @@ @@ -1,220 +0,0 @@
1 -  
2 -@startuml  
3 -  
4 -!include <tupadr3/common>  
5 -!include <tupadr3/font-awesome/server>  
6 -  
7 -  
8 -  
9 -/'  
10 -UML class Diagram : can be displayed with PlantUML (plugin for Eclipse or for PyCharm)  
11 -  
12 -PlantUML:  
13 -- How to install : https://projects.irap.omp.eu/projects/pyros/wiki/Project_Development#PlantUML  
14 -- Eclipse plugin : http://plantuml.com/eclipse  
15 -- class diagrams : http://plantuml.com/class-diagram  
16 -- sequence diagrams : http://plantuml.com/sequence-diagram  
17 -- state diagrams : http://plantuml.com/state-diagram  
18 -- Use Case diagrams : http://plantuml.com/use-case-diagram  
19 -- OLD Activity diagrams : http://plantuml.com/activity-diagram-legacy  
20 -- NEW Activity diagrams : http://plantuml.com/activity-diagram-beta  
21 -- Pre-processing (include...) : http://plantuml.com/preprocessing  
22 -- GANTT diagrams : http://plantuml.com/gantt-diagram  
23 -- REAL WORLD EXAMPLES !!! : https://real-world-plantuml.com/  
24 -- For Python:  
25 - - https://github.com/SamuelMarks/python-plantuml  
26 - - https://pythonhosted.org/plantuml/  
27 -  
28 -UML diagrams theory : https://www.ibm.com/developerworks/rational/library/content/RationalEdge/sep04/bell/index.html  
29 -'/  
30 -  
31 -title  
32 -__**PyROS class diagram (AgentMajordome example)**__  
33 -'<size:10><i>Version 16-10-2019</i></size>'  
34 -  
35 -end title  
36 -  
37 -  
38 -  
39 -/' Allow to mix object/class diagram with other symbols like a "server" symbol '/  
40 -allowmixing  
41 -  
42 -FA_SERVER(sbig_device,SBIG detector) #Red  
43 -FA_SERVER(gemini_device,Gemini telescope) #Red  
44 -  
45 -  
46 -  
47 -/' ======= AgentMajordome & AgentDevices ======= '/  
48 -  
49 -class AgentMajordome <<Singleton>> #yellow  
50 -AgentMajordome -u-|> Agent  
51 -AgentDevice -u-|> Agent  
52 -  
53 -/' Aliases to AgentDevices '/  
54 -object AD_Telescope1  
55 -object AD_FilterSelector1  
56 -object AD_Shutter1  
57 -object AD_Sensor1  
58 -object AD_Shutter2  
59 -  
60 -/' Use l,r,u,d for left, right, up, or down row alignement '/  
61 -AgentMajordome -d-> AD_Telescope1 : sends cmd to  
62 -AgentMajordome -d-> AD_FilterSelector1 : sends cmd to  
63 -AgentMajordome -d-> AD_Shutter1 : sends cmd to  
64 -AgentMajordome -d-> AD_Sensor1 : sends cmd to  
65 -AgentMajordome -d-> AD_Shutter2 : sends cmd to  
66 -  
67 -  
68 -class DeviceController {  
69 - ip, port  
70 - channel: ClientChannel  
71 - protocol: Protocol # abstract  
72 - gen2nat_cmds: Gen2NatCmds # abstract  
73 -}  
74 -  
75 -class DC_Mount {  
76 - gen2nat_cmds: Gen2NatCmds # abstract  
77 -}  
78 -class DC_DetectorShutter {  
79 - gen2nat_cmds: Gen2NatCmds # abstract  
80 -}  
81 -class DC_DetectorSensor {  
82 - gen2nat_cmds: Gen2NatCmds # abstract  
83 -}  
84 -class DC_FilterSelector {  
85 - gen2nat_cmds: Gen2NatCmds # abstract  
86 -}  
87 -  
88 -  
89 -  
90 -  
91 -/' ======= CHANNELS ======= '/  
92 -  
93 -DeviceController "1" o-r- "0..1" DeviceSimulator  
94 -  
95 -DeviceController o-d- ClientChannel  
96 -class ClientChannelSerial #lightred  
97 -class ClientChannelSocket #lightred  
98 -class ClientChannelUSB #lightred  
99 -ClientChannel <|-- ClientChannelSerial  
100 -ClientChannel <|-- ClientChannelSocket  
101 -ClientChannel <|-- ClientChannelUSB  
102 -  
103 -  
104 -/' ======= GEMINI controllers (& sim) ======= '/  
105 -  
106 -class AgentDeviceGemini #lightblue  
107 -AgentDeviceGemini -u--|> AgentDevice  
108 -  
109 -/' Components (only 1) '/  
110 -AD_Telescope1 -d-> AgentDeviceGemini :alias of  
111 -  
112 -/'DC_Mount o-left- DS_Mount'/  
113 -  
114 -/'AgentDeviceGemini ---> DC_Gemini :use'/  
115 -AgentDeviceGemini "1" o--- "1" DC_Gemini :use  
116 -  
117 -/' Controllers '/  
118 -class DC_Gemini {  
119 - (client)  
120 - protocol: Protocol # gemini  
121 - gen2nat_cmds: Gen2NatCmds # gemini  
122 -}  
123 -class DC_Gemini <<Singleton>> #lightblue  
124 -DC_Gemini <.l> gemini_device : channel/\nsocket  
125 -DC_Gemini ---|> DeviceController  
126 -DC_Gemini "*" o-- "1" DC_Mount  
127 -DC_Mount --|> DeviceController  
128 -  
129 -/' Simulators '/  
130 -class DS_Gemini {  
131 - (server)  
132 - protocol: Protocol # gemini  
133 - gen2nat_cmds: Gen2NatCmds # gemini  
134 -}  
135 -class DS_Gemini #lightblue  
136 -DS_Gemini ---|> DeviceSimulator  
137 -DC_Gemini "1" o- "1" DS_Gemini  
138 -  
139 -  
140 -  
141 -/' ======= SBIG controllers (& sim) ======= '/  
142 -  
143 -class AgentDeviceSBIG <<Singleton>> #lightgreen  
144 -AgentDeviceSBIG -u--|> AgentDevice  
145 -  
146 -/' Components (3) '/  
147 -AD_FilterSelector1 --> AgentDeviceSBIG :alias of  
148 -AD_Shutter1 --> AgentDeviceSBIG :alias of  
149 -AD_Sensor1 --> AgentDeviceSBIG :alias of  
150 -  
151 -AgentDeviceSBIG "1" o-d-> "1" DC_SBIG :use  
152 -DC_SBIG "1" o- "1" DS_SBIG  
153 -  
154 -/' Controllers '/  
155 -  
156 -class DC_SBIG {  
157 - (client)  
158 - protocol: Protocol # sbig  
159 - gen2nat_cmds: Gen2NatCmds # sbig  
160 -}  
161 -class DC_SBIG <<Singleton>> #lightgreen  
162 -  
163 -DC_SBIG <.r> sbig_device : channel/\nsocket  
164 -DC_SBIG ---|> DeviceController  
165 -DC_SBIG "*" o-down- "0..1" DC_DetectorSensor  
166 -DC_SBIG "*" o-down- "0..1" DC_DetectorShutter  
167 -DC_SBIG "*" o-down- "0..1" DC_FilterSelector  
168 -  
169 -DC_DetectorSensor --|> DeviceController  
170 -DC_DetectorShutter --|> DeviceController  
171 -DC_FilterSelector --|> DeviceController  
172 -  
173 -/' Simulators '/  
174 -class DS_SBIG {  
175 - (server)  
176 - protocol: Protocol # sbig  
177 - gen2nat_cmds: Gen2NatCmds # sbig  
178 -}  
179 -class DS_SBIG #lightgreen  
180 -DS_SBIG ---|> DeviceSimulator  
181 -  
182 -  
183 -/' ======= NOTES ======= '/  
184 -  
185 -skinparam noteFontSize 9  
186 -  
187 -note left of DeviceController  
188 -Device <b>client</b> (pyros <b>generic commands</b> only):  
189 -- Defines (or receives) its own protocol  
190 - and "generic to native" commands dictionary (gen2nat_cmds)  
191 -- Translates an agent <b>generic</b> command to a native command,  
192 - and sends it to device (or DS)  
193 -- Receives device's native answer, translates it to <b>generic</b>  
194 - and returns it back to agent  
195 -(//every DC can include a **DS of the same name**//)  
196 - end note  
197 -  
198 -note bottom of DeviceSimulator  
199 -Device placeholder <b>server</b> (<b>native commands</b> only):  
200 -- Receives <b>native</b> commands from client  
201 -- Returns (simulated) <b>native</b> answer to client  
202 -(uses protocol and gen2nat_cmds given by its associated DC)  
203 -(//abstract DS receive only generic commands and return generic answers//)  
204 - end note  
205 -  
206 -  
207 -  
208 -/' ======= LEGEND ======= '/  
209 -  
210 -skinparam legendFontSize 9  
211 -  
212 -legend left  
213 -<i>Version 06-11-2019</i>  
214 -AD = <b>Agent Device</b> ; DC = <b>Device Controller</b> ; DS = <b>Device Simulator</b>  
215 -Colors: <b>(light) yellow</b> : abstract classes ; <b>red</b> : real devices ; <b>blue</b> : Gemini concrete classes ; <b>green</b> : SBIG concrete classes  
216 -endlegend  
217 -'(E. Pallier)  
218 -  
219 -  
220 -@enduml