Difference: InstallingAndConfiguringSwift (1 vs. 9)

Revision 92012-10-22 - EnricoFattibene

Line: 1 to 1
 
META TOPICPARENT name="Trash.MarcheCloudMarcheCloud"

Installazione e configurazione del servizio Object Storage (Swift)

Line: 416 to 416
 

-- EnricoFattibene - 2012-10-12

Added:
>
>
META TOPICMOVED by="EnricoFattibene" date="1350916597" from="GestioneServiziGenerali.InstallingAndConfiguringSwift" to="MarcheCloud.InstallingAndConfiguringSwift"

Revision 82012-10-22 - TWikiAdminUser

Line: 1 to 1
Changed:
<
<
META TOPICPARENT name="MarcheCloud"
>
>
META TOPICPARENT name="Trash.MarcheCloudMarcheCloud"
 

Installazione e configurazione del servizio Object Storage (Swift)

Revision 72012-10-19 - EnricoFattibene

Line: 1 to 1
 
META TOPICPARENT name="MarcheCloud"

Installazione e configurazione del servizio Object Storage (Swift)

Revision 62012-10-18 - EnricoFattibene

Line: 1 to 1
 
META TOPICPARENT name="MarcheCloud"

Installazione e configurazione del servizio Object Storage (Swift)

Line: 121 to 121
 
# service rsyncd start
Added:
>
>
Nota bene: non possibile usare il comando chkconfig per far partire il servizio rsyncd in automatico all'avvio del server, quindi necessario farlo partire manualmente ad ogni riavvio.
 
  • Creare il file /etc/swift/account-server.conf:

Revision 52012-10-17 - MatteoManzali

Line: 1 to 1
 
META TOPICPARENT name="MarcheCloud"

Installazione e configurazione del servizio Object Storage (Swift)

Line: 112 to 112
 exit 0
Changed:
<
<
  • Cambiare i proprietari di file e directory in maniera ricorsiva:
>
>
  • Settare il default SELinux file context per lo script appena creato:
 
# restorecon -R -v /etc/rc.d/init.d/rsyncd

Revision 42012-10-17 - EnricoFattibene

Line: 1 to 1
 
META TOPICPARENT name="MarcheCloud"

Installazione e configurazione del servizio Object Storage (Swift)

Line: 203 to 203
 
  • Far partire il servizio memcached

Changed:
<
<
service memcached restart
>
>
# service memcached restart Fare in modo che memcached parta all'avvio del server:
# chkconfig memcached on
 

  • Create /etc/swift/proxy-server.conf:
Line: 361 to 365
 # swift-init main start # swift-init rest start
Added:
>
>
Fare in modo che i servizi di swift partano all'avvio del server:
# chkconfig openstack-swift-account on
# chkconfig openstack-swift-container on
# chkconfig openstack-swift-object on
 
  • Sul server Proxy far partire il servizio proxy:
    # swift-init proxy start
    
Added:
>
>
Fare in modo che i servizi di swift partano all'avvio del server:
# chkconfig openstack-swift-proxy on
 


Revision 32012-10-15 - EnricoFattibene

Line: 1 to 1
 
META TOPICPARENT name="MarcheCloud"

Installazione e configurazione del servizio Object Storage (Swift)

Line: 9 to 9
 # yum install openstack-swift-account openstack-swift-container openstack-swift-object xfsprogs
Changed:
<
<
  • Create and populate configuration directories on all nodes:
>
>
  • Creare la directory di configurazione e settate i proprietari:
 
# mkdir -p /etc/swift
# chown -R swift:swift /etc/swift/    
Changed:
<
<
  • Create /etc/swift/swift.conf:
>
>
  • Creare il file /etc/swift/swift.conf:
 
[swift-hash]
# random unique string that can never change (DO NOT LOSE)
swift_hash_path_suffix = fLIbertYgibbitZ
Added:
>
>
Creare e montare un volume logico attraverso i seguenti passi:
 
  1. Creare un volume logico di 800 Gigabyte sul server:
    # lvcreate -L 800G -n lv_swift <VOLUME_NAME>
Line: 54 to 56
 # chown -R swift:swift /srv/node
Added:
>
>
  • Creare il file di configuarazione per rsync /etc/rsyncd.conf:
    uid = swift
    gid = swift
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid
    address = <STORAGE_LOCAL_NET_IP>
    
    [account]
    max connections = 2
    path = /srv/node/
    read only = false
    lock file = /var/lock/account.lock
    
    [container]
    max connections = 2
    path = /srv/node/
    read only = false
    lock file = /var/lock/container.lock
    
    [object]
    max connections = 2
    path = /srv/node/
    read only = false
    lock file = /var/lock/object.lock
    
    Dove <STORAGE_LOCAL_NET_IP> l'indirizzo IP dello Storage node.

  • Editare la seguente riga nel file /etc/default/rsync:
    RSYNC_ENABLE = true
    

  • Creare uno script /etc/rc.d/init.d/rsyncd che possa far partire il servizio rsync:
    #!/bin/bash
    
    # Source function library.
    . /etc/rc.d/init.d/functions
    
    [ -f /usr/bin/rsync ] || exit 0
    
    case "$1" in
    start)
    action "Starting rsyncd: " /usr/bin/rsync --daemon
    ;;
    stop)
    action "Stopping rsyncd: " killall rsync
    ;;
    *)
    echo "Usage: rsyncd {start|stop}"
    exit 1
    esac
    exit 0
    

  • Cambiare i proprietari di file e directory in maniera ricorsiva:
    # restorecon -R -v /etc/rc.d/init.d/rsyncd
    

  • Lanciare rsyncd attraverso il nuovo script creato:
    # service rsyncd start
    

  • Creare il file /etc/swift/account-server.conf:
    [DEFAULT]
    bind_ip = <STORAGE_LOCAL_NET_IP>
    workers = 1
    
    [pipeline:main]
    pipeline = account-server
    
    [app:account-server]
    use = egg:swift#account
    
    [account-replicator]
    
    [account-auditor]
    
    [account-reaper]
    

  • Creare il file /etc/swift/container-server.conf:
    [DEFAULT]
    bind_ip = <STORAGE_LOCAL_NET_IP>
    workers = 1
    
    [pipeline:main]
    pipeline = container-server
    
    [app:container-server]
    use = egg:swift#container
    
    [container-replicator]
    
    [container-updater]
    
    [container-auditor]
    
    [container-sync]
    

  • Creare il file /etc/swift/object-server.conf:
    [DEFAULT]
    bind_ip = <STORAGE_LOCAL_NET_IP>
    workers = 1
    
    [pipeline:main]
    pipeline = object-server
    
    [app:object-server]
    use = egg:swift#object
    
    [object-replicator]
    
    [object-updater]
    
    [object-auditor]
    
    [object-expirer]
    
 

Installazione e configurazione di Proxy server

  • Installare i pacchetti del Proxy server
Line: 67 to 196
 

  • Creare un certificato auto-firmato per SSL:
Changed:
<
<
cd /etc/swift openssl req -new -x509 -nodes -out cert.crt -keyout cert.key

  • Modify memcached to listen on the default interfaces. Preferably this should be on a local, non-public network. Edit the following line in /etc/memcached.conf, changing:
-l 127.0.0.1 to -l
>
>
# cd /etc/swift
# openssl req -new -x509 -nodes -out cert.crt -keyout cert.key
 
  • Far partire il servizio memcached

Line: 83 to 209
 
  • Create /etc/swift/proxy-server.conf:
    [DEFAULT]
Changed:
<
<
bind_port = 8888
>
>
bind_port = 8080
 user =

[pipeline:main]

Line: 108 to 234
 auth_host = auth_token = admin_token =
Added:
>
>
auth_protocol = http
  [filter:cache] use = egg:swift#memcache
Line: 120 to 247
 use = egg:swift#healthcheck
Changed:
<
<
  • Create the account, container and object rings. The builder command is basically creating a builder file with a few parameters. The parameter with the value of 18 represents 2 ^ 18th, the value that the partition will be sized to. Set this partition power value based on the total amount of storage you expect your entire ring to use. The value of 3 represents the number of replicas of each object, with the last value being the number of hours to restrict moving a partition more than once.
>
>
  • Creare i ring per account, container e oggetti:
 
Changed:
<
<
cd /etc/swift swift-ring-builder account.builder create 7 1 24 swift-ring-builder container.builder create 7 1 24 swift-ring-builder object.builder create 7 1 24 Nota bene: il numero di repliche non pu essere superiore al numero di nodi storage.

  • Su ognuno degli storage node lanciare i seguenti comandi:
    swift-ring-builder account.builder add z<ZONE>-<STORAGE_LOCAL_NET_IP>:6002/<DEVICE> 100
    swift-ring-builder container.builder add z<ZONE>-<STORAGE_LOCAL_NET_IP_1>:6001/<DEVICE> 100
    swift-ring-builder object.builder add z<ZONE>-<STORAGE_LOCAL_NET_IP_1>:6000/<DEVICE> 100
>
>
# cd /etc/swift # swift-ring-builder account.builder create 7 1 24 # swift-ring-builder container.builder create 7 1 24 # swift-ring-builder object.builder create 7 1 24 Dove:
    • Il primo valore numerico (7 nell'esempio) calcolato come segue: considerata la potenza in base 2 appena superiore al valore della partizione di storage in Gigabyte diviso 10, il valore da riportare l'esponente di tale potenza. Nell'esempio riportato la partizione di 800 GB, 2^7 (128) la potenza di 2 appena superiore a 800/10=80.
    • Il secondo valore numerico (1 nell'esempio) il numero di repliche di ogni oggetto. Nota bene: tale numero non pu essere superiore al numero di nodi storage.
    • Il terzo valore numerico (24 nell'esempio) indica che la prtizione pu essere spostata una volta ogni 24 ore.

  • Su ognuno degli Storage node lanciare i seguenti comandi:
    swift-ring-builder account.builder add z<ZONE>-<STORAGE_LOCAL_NET_IP>:6002/<DEVICE> <NUM>
    swift-ring-builder container.builder add z<ZONE>-<STORAGE_LOCAL_NET_IP_1>:6001/<DEVICE> <NUM>
    swift-ring-builder object.builder add z<ZONE>-<STORAGE_LOCAL_NET_IP_1>:6000/<DEVICE> <NUM>
  Per esempio sul nodo openstack-04.cnaf.infn.it si setta uno storage node con una partizione in Zona 1 sull'IP del server (131.154.100.113). Il mount point di questa partizione /srv/node/swift, la partizione il volume logico "swift", e 80 il numero di Terabyte della partizione moltiplicato per 100. I comandi da lanciare sono:

Line: 145 to 275
 Device z1-131.154.100.113:6000/swift_"" with 80.0 weight got id 0
Changed:
<
<
  • Verify the ring contents for each ring:
>
>
  • Verificare il contenuto di ogni ring:
 
# swift-ring-builder account.builder
account.builder, build version 1
Line: 169 to 299
  0 1 131.154.100.113 6000 swift 80.00 0 -100.00
Changed:
<
<
*Rebalance the rings:
>
>
  • Ri-bilanciare i ring:
 
# swift-ring-builder account.builder rebalance
Reassigned 128 (100.00%) partitions. Balance is now 0.00.
Line: 181 to 311
 Reassigned 128 (100.00%) partitions. Balance is now 0.00.
Changed:
<
<
>
>
  • Verificare nuovamente il contenuto di ogni ring:
 
# swift-ring-builder container.builder
container.builder, build version 1
Line: 205 to 335
  0 1 131.154.100.113 6002 swift 80.00 128 0.00
Changed:
<
<
Copy the account.ring.gz, container.ring.gz, and object.ring.gz files to each of the Proxy and Storage nodes in /etc/swift.

Make sure all the config files are owned by the swift user:

>
>
  • Copiare i file account.ring.gz, container.ring.gz e object.ring.gz su ognuno dei server Proxy e Storage node in /etc/swift.
 
Added:
>
>
  • Assicurarsi che i file di configurazione abbiano i seguenti proprietari:

 chown -R swift:swift /etc/swift
Added:
>
>
 
  • Su tutti gli Storage node far partire i servizi di Swift:

Line: 225 to 356
 # swift-init account-replicator start # swift-init account-auditor start
Added:
>
>
Si possono usare i seguenti comandi compatti:
# swift-init main start
# swift-init rest start
 
  • Sul server Proxy far partire il servizio proxy:

Line: 232 to 368
 
Changed:
<
<
Verifica: # export ADMINPASS=secretword # swift -V 2 -A http://:5000/v2.0 -U adminUser:admin -K $ADMINPASS stat [root@openstack-04 etc]# swift -V 2 -A http://openstack-01.cnaf.infn.it:5000/v2.0 -U adminUser:adminUser -K $ADMINPASS stat There is no object-store endpoint on this auth server.
>
>

Troubleshooting

  • Da linea di comando usare il comando swift per mostrare informationi su account, container o oggetti.
    # swift -V 2 -A http://<KEYSTONE_HOSTNAME>:5000/v2.0 -U <SERVICE_TENANT>:<SWIFT_USER> -K <ADMIN_PASSWORD> stat
    
    Dove:
    • <KEYSTONE_HOSTNAME> l'hostname del server Keystone (nel prototipo in esempio openstack-01.cnaf.infn.it)
    • <SERVICE_TENANT> il tenant del DB di Keystone che racchiude gli utenti dei servizi OpenStack
    • <SWIFT_USER> il nome dell'utente del servizio Swift nel DB di Keystone
    • <ADMIN_PASSWORD> la password dell'utente del servizio Swift nel DB di Keystone
 
Added:
>
>
  • Caricare un file (viene creato automaticamente il container):
    # swift -V 2 -A http://<KEYSTONE_HOSTNAME>:5000/v2.0 -U <SERVICE_TENANT>:<SWIFT_USER> -K <ADMIN_PASSWORD> upload <CONTAINER_NAME> <FILE_NAME>
    
    Dove
    • <CONTAINER_NAME> il nome del container che si intende creare
    • <FILE_NAME> il nome del file che si intende caricare

  • Scaricare un file:
    # swift -V 2 -A http://<KEYSTONE_HOSTNAME>:5000/v2.0 -U <SERVICE_TENANT>:<SWIFT_USER> -K <ADMIN_PASSWORD> download <CONTAINER_NAME> <FILE_NAME>
    
 
Added:
>
>
  • Mostrare i container esistenti:
    # swift -V 2 -A http://<KEYSTONE_HOSTNAME>:5000/v2.0 -U <SERVICE_TENANT>:<SWIFT_USER> -K <ADMIN_PASSWORD> list
    


  -- EnricoFattibene - 2012-10-12

Revision 22012-10-12 - EnricoFattibene

Line: 1 to 1
 
META TOPICPARENT name="MarcheCloud"

Installazione e configurazione del servizio Object Storage (Swift)

Changed:
<
<

Installazione e configurazione di Proxy server e Storage node

  • Installare i pacchetti di Proxy server e Storage node
>
>

Installazione e configurazione di Storage node

  • Installare i pacchetti di Storage node
 
Changed:
<
<
# yum install openstack-swift openstack-swift-proxy openstack-swift-account openstack-swift-container openstack-swift-object memcached
>
>
# yum install openstack-swift-account openstack-swift-container openstack-swift-object xfsprogs
 

  • Create and populate configuration directories on all nodes:
Line: 49 to 49
 # mount a
Changed:
<
<
  1. Settare i proprietari dei della directory superiore:
>
>
  1. Settare i proprietari della directory superiore:
 
# chown -R swift:swift /srv/node
Added:
>
>

Installazione e configurazione di Proxy server

  • Installare i pacchetti del Proxy server
    # yum install openstack-swift-proxy memcached
    

  • Installare i pacchetti di python-keystone:
    # yum install python-keystone python-keystoneclient
    

  • Creare un certificato auto-firmato per SSL:
cd /etc/swift openssl req -new -x509 -nodes -out cert.crt -keyout cert.key
 
Added:
>
>
  • Modify memcached to listen on the default interfaces. Preferably this should be on a local, non-public network. Edit the following line in /etc/memcached.conf, changing:
-l 127.0.0.1 to -l
 
Added:
>
>
  • Far partire il servizio memcached
 
Changed:
<
<
# yum install openstack-swift-account openstack-swift-container openstack-swift-object xfsprogs
>
>
service memcached restart

  • Create /etc/swift/proxy-server.conf:
    [DEFAULT]
    bind_port = 8888
    user = <SWIFT_USER_NAME>
    
    [pipeline:main]
    pipeline = catch_errors healthcheck cache authtoken keystone proxy-server
    
    [app:proxy-server]
    use = egg:swift#proxy
    account_autocreate = true
    
    [filter:keystone]
    paste.filter_factory = keystone.middleware.swift_auth:filter_factory
    operator_roles = admin, swiftoperator
    
    [filter:authtoken]
    paste.filter_factory = keystone.middleware.auth_token:filter_factory
    # Delaying the auth decision is required to support token-less
    # usage for anonymous referrers ('.r:*').
    delay_auth_decision = 1
    service_port = 5000
    service_host = <KEYSTONE_HOSTNAME>
    auth_port = 35357
    auth_host = <KEYSTONE_HOSTNAME>
    auth_token = <ADMIN_TOKEN>
    admin_token = <ADMIN_TOKEN>
    
    [filter:cache]
    use = egg:swift#memcache
    set log_name = cache
    
    [filter:catch_errors]
    use = egg:swift#catch_errors
    
    [filter:healthcheck]
    use = egg:swift#healthcheck
    

  • Create the account, container and object rings. The builder command is basically creating a builder file with a few parameters. The parameter with the value of 18 represents 2 ^ 18th, the value that the partition will be sized to. Set this partition power value based on the total amount of storage you expect your entire ring to use. The value of 3 represents the number of replicas of each object, with the last value being the number of hours to restrict moving a partition more than once.
    cd /etc/swift
    swift-ring-builder account.builder create 7 1 24
    swift-ring-builder container.builder create 7 1 24
    swift-ring-builder object.builder create 7 1 24
    
    Nota bene: il numero di repliche non pu essere superiore al numero di nodi storage.

  • Su ognuno degli storage node lanciare i seguenti comandi:
    swift-ring-builder account.builder add z<ZONE>-<STORAGE_LOCAL_NET_IP>:6002/<DEVICE> 100
    swift-ring-builder container.builder add z<ZONE>-<STORAGE_LOCAL_NET_IP_1>:6001/<DEVICE> 100
    swift-ring-builder object.builder add z<ZONE>-<STORAGE_LOCAL_NET_IP_1>:6000/<DEVICE> 100
    
    Per esempio sul nodo openstack-04.cnaf.infn.it si setta uno storage node con una partizione in Zona 1 sull'IP del server (131.154.100.113). Il mount point di questa partizione /srv/node/swift, la partizione il volume logico "swift", e 80 il numero di Terabyte della partizione moltiplicato per 100. I comandi da lanciare sono:
    # swift-ring-builder account.builder add z1-131.154.100.113:6002/swift 80
    Device z1-131.154.100.113:6002/swift_"" with 80.0 weight got id 0
    # swift-ring-builder container.builder add z1-131.154.100.113:6001/swift 80
    Device z1-131.154.100.113:6001/swift_"" with 80.0 weight got id 0
    # swift-ring-builder object.builder add z1-131.154.100.113:6000/swift 80
    Device z1-131.154.100.113:6000/swift_"" with 80.0 weight got id 0
    

  • Verify the ring contents for each ring:
    # swift-ring-builder account.builder
    account.builder, build version 1
    128 partitions, 1 replicas, 1 zones, 1 devices, 100.00 balance
    The minimum number of hours before a partition can be reassigned is 24
    Devices:    id  zone      ip address  port      name weight partitions balance meta
                 0     1 131.154.100.113  6002     swift  80.00          0 -100.00 
    
    # swift-ring-builder container.builder
    container.builder, build version 1
    128 partitions, 1 replicas, 1 zones, 1 devices, 100.00 balance
    The minimum number of hours before a partition can be reassigned is 24
    Devices:    id  zone      ip address  port      name weight partitions balance meta
                 0     1 131.154.100.113  6001     swift  80.00          0 -100.00 
    
    # swift-ring-builder object.builder
    object.builder, build version 1
    128 partitions, 1 replicas, 1 zones, 1 devices, 100.00 balance
    The minimum number of hours before a partition can be reassigned is 24
    Devices:    id  zone      ip address  port      name weight partitions balance meta
                 0     1 131.154.100.113  6000     swift  80.00          0 -100.00
    

*Rebalance the rings:

# swift-ring-builder account.builder rebalance
Reassigned 128 (100.00%) partitions. Balance is now 0.00.

# swift-ring-builder container.builder rebalance
Reassigned 128 (100.00%) partitions. Balance is now 0.00.

# swift-ring-builder object.builder rebalance
Reassigned 128 (100.00%) partitions. Balance is now 0.00.
 
Added:
>
>
# swift-ring-builder container.builder
container.builder, build version 1
128 partitions, 1 replicas, 1 zones, 1 devices, 0.00 balance
The minimum number of hours before a partition can be reassigned is 24
Devices:    id  zone      ip address  port      name weight partitions balance meta
             0     1 131.154.100.113  6001     swift  80.00        128    0.00 

# swift-ring-builder object.builder
object.builder, build version 1
128 partitions, 1 replicas, 1 zones, 1 devices, 0.00 balance
The minimum number of hours before a partition can be reassigned is 24
Devices:    id  zone      ip address  port      name weight partitions balance meta
             0     1 131.154.100.113  6000     swift  80.00        128    0.00 

# swift-ring-builder account.builder
account.builder, build version 1
128 partitions, 1 replicas, 1 zones, 1 devices, 0.00 balance
The minimum number of hours before a partition can be reassigned is 24
Devices:    id  zone      ip address  port      name weight partitions balance meta
             0     1 131.154.100.113  6002     swift  80.00        128    0.00 

Copy the account.ring.gz, container.ring.gz, and object.ring.gz files to each of the Proxy and Storage nodes in /etc/swift.

Make sure all the config files are owned by the swift user:

chown -R swift:swift /etc/swift

  • Su tutti gli Storage node far partire i servizi di Swift:
    # swift-init object-server start
    # swift-init object-replicator start
    # swift-init object-updater start
    # swift-init object-auditor start
    # swift-init container-server start
    # swift-init container-replicator start
    # swift-init container-updater start
    # swift-init container-auditor start
    # swift-init account-server start
    # swift-init account-replicator start
    # swift-init account-auditor start
    

  • Sul server Proxy far partire il servizio proxy:
    # swift-init proxy start
    

Verifica: # export ADMINPASS=secretword # swift -V 2 -A http://:5000/v2.0 -U adminUser:admin -K $ADMINPASS stat [root@openstack-04 etc]# swift -V 2 -A http://openstack-01.cnaf.infn.it:5000/v2.0 -U adminUser:adminUser -K $ADMINPASS stat There is no object-store endpoint on this auth server.

 -- EnricoFattibene - 2012-10-12

Revision 12012-10-12 - EnricoFattibene

Line: 1 to 1
Added:
>
>
META TOPICPARENT name="MarcheCloud"

Installazione e configurazione del servizio Object Storage (Swift)

Installazione e configurazione di Proxy server e Storage node

  • Installare i pacchetti di Proxy server e Storage node
    # yum install openstack-swift openstack-swift-proxy openstack-swift-account openstack-swift-container openstack-swift-object memcached
    

  • Create and populate configuration directories on all nodes:
    # mkdir -p /etc/swift
    # chown -R swift:swift /etc/swift/    
    

  • Create /etc/swift/swift.conf:
    [swift-hash]
    # random unique string that can never change (DO NOT LOSE)
    swift_hash_path_suffix = fLIbertYgibbitZ
    

  1. Creare un volume logico di 800 Gigabyte sul server:
    # lvcreate -L 800G -n lv_swift <VOLUME_NAME>
    
    dove <VOLUME_NAME> il nome del volume fisico sul quale si intende creare il volume logico.
    
    
  2. Formattare la partizione appena creata su filesystem xfs con blocchi da 1024 byte:
    # mkfs.xfs -i size=1024 <LV_PATH> 
    
    dove <LV_PATH> il percorso del volume logico ricavabile tramite il comando lvdisplay .
    
    
  3. Creare la directory dove si intende montare il volume appena creato:
    # mkdir -p /srv/node/swift
    
    
    
  4. Per consentire che il volume logico sia montato all'avvio del server, editare il file /etc/fstab aggiungendo la seguente riga:
    <LV_PATH>       /srv/node/swift       xfs    noatime,nodiratime,nobarrier,logbufs=8    0 0
    
    
    
  5. Montare il volume:
    # mount a 
    
    
    
  6. Settare i proprietari dei della directory superiore:
    # chown -R swift:swift /srv/node
    

# yum install openstack-swift-account openstack-swift-container openstack-swift-object xfsprogs

-- EnricoFattibene - 2012-10-12

 
This site is powered by the TWiki collaboration platformCopyright © 2008-2019 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback