reusable self-adaptation through bidirectional programming
TRANSCRIPT
Reusable Self-Adaptation through Bidirectional
ProgrammingKevin Colson†, Robin Dupuis†, Lionel Montrieux◊, Zhenjiang Hu◊,
Sebastian Uchitel¶§, Pierre-Yves Schobbens†
† University of Namur, Belgium ◊ National Institute of Informatics, Tokyo, Japan
¶ University of Buenos Aires, Argentina § Imperial College, London, UK
User www-data Group www-data ServerRoot "/etc/apache2" PidFile /var/run/apache2/apache2.pid ErrorLog /var/log/apache2/error.log
User www-data Group www-data ServerRoot "/etc/apache2" PidFile /var/run/apache2/apache2.pid Timeout 300 ErrorLog /var/log/apache2/error.log LogLevel warn
User www-data Group www-data ServerRoot "/etc/apache2" PidFile /var/run/apache2/apache2.pid Timeout 300 ErrorLog /var/log/apache2/error.log LogLevel warn
<VirtualHost *:80> ServerName www.example.com ServerAdmin webmaster@localhost DocumentRoot /var/www/html
</VirtualHost>
User www-data Group www-data ServerRoot "/etc/apache2" PidFile /var/run/apache2/apache2.pid Timeout 300 ErrorLog /var/log/apache2/error.log LogLevel warn
<VirtualHost *:80> ServerName www.nii.ac.jp ServerAdmin [email protected] DocumentRoot /var/www/html ErrorLog /var/log/apache2/nii_error.log
</VirtualHost>
M A P E
K
Target System
Environment
File’FileReloadService
(E)Changes
(A,P)
gzip on; index index.html index.htm; keepalive_timeout 65; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log;
gzip off; index index.html index.htm; keepalive_timeout 65; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log;
$ service nginx reload
ErrorLog /var/log/apache2/error.log <ifModule mod_gzip.c> mod_gzip_on Yes </ifModule> Listen 80 Listen 443
<VirtualHost *:80> ServerName www.example.com ServerAdmin webmaster@localhost DocumentRoot /var/www/html
ErrorLog /var/log/apache2/error.log <ifModule mod_gzip.c> mod_gzip_on No </ifModule> Listen 80 Listen 443
<VirtualHost *:80> ServerName www.example.com ServerAdmin webmaster@localhost DocumentRoot /var/www/html
$ service httpd restart
ApacheReloadService
(E)
Changes Apache Apache’
NginxReloadService
(E)Changes
Nginx Nginx’
WebSrvChanges WebSrv WebSrv’
WebSrv
Apache …Nginx
Synchronisation
Bidirectional Transformations
get :: Source -> View put :: Source -> View -> Source
get (x:xs) = x put (x:xs) y = y:xs
get [1,2,3] = 1 put [1,2,3] 99 = [99,2,3]
[Foster09]
GetPutput s (get s) = s
put [1,2,3] (get [1,2,3]) = [1,2,3]
put [1,2,3] 1 = [1,2,3]
[Foster10]
PutGetget (put s v) = v
get (put [1,2,3] 99) = 99
get [99,2,3] = 99
[Foster10]
Bidirectional Programming
Putback-based (BiGUL)
updNginx :: BiGUL Nginx Common
get :: BiGUL s v -> s -> GetResult s v
put :: BiGUL s v -> s -> v -> PutResult s v
[Fischer15, Ko16]
Default Values?
defaults :: DefaultValues defaults = DefaultValues { d_accept_mutex = "on", d_accept_mutex_delay = "500ms", d_access_log = "logs/access.log combined” }
updNginx :: BiGUL Nginx Common
updNginx :: DefaultValues -> BiGUL Nginx Common
Context Overriding?
Putting it all together
conf.file parser source get
view
def. vals.
APview’put
source’ prettyprinter
conf. file’
servicereload X
One more thing…
WebSrv
Apache Nginx
Nginx (empty)
putnginxgetapache
Case Study
Conclusion
https://github.com/prl-tokyo/bigul-configuration-adaptation
Check it out
Try BiGUL
$ cabal install bigul
Get in [email protected]