├── .gitignore ├── Makefile ├── README.md ├── allocate-floating-ip.png ├── boot-instance.md ├── cleanup.md ├── dashboard.md ├── devstack.md ├── diagrams.graffle ├── getting-started.md ├── launch-instance-net.png ├── launch-instance.png ├── menu-associate-floating-ip.png ├── network-under-hood.png ├── object-storage.md ├── openstack-cloud-software-vertical-small.png ├── rackspace-api.png ├── rackspace-screen.png ├── rax.openrc ├── temp-url.md ├── under-the-hood-compute.md ├── under-the-hood-network.md ├── under-the-hood-object.md ├── under-the-hood-volumes.md └── under-the-hood.md /.gitignore: -------------------------------------------------------------------------------- 1 | *.html 2 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # 2 | # Use pandoc to generate docs 3 | # 4 | .PHONY: all 5 | 6 | all: README.html boot-instance.html devstack.html getting-started.html object-storage.html under-the-hood.html 7 | 8 | %.html: %.md 9 | pandoc $< -o $@ 10 | 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenStack Hackspace 2 | 3 | ## What you'll be doing 4 | 5 | * Interacting with a production OpenStack deployment (Rackspace Public Cloud) using command-line tools 6 | * Doing your own deployment of OpenStack (DevStack) inside of the Rackspace cloud 7 | * Interacting with your OpenStack deployment using the OpenStack Dashboard 8 | * Poking around your deployment to understand how OpenStack is implemented 9 | 10 | ## What you need 11 | 12 | This document assumes you have: 13 | 14 | - Rackspace credentials 15 | * account name 16 | * password 17 | - A computer with 18 | * Internet access 19 | * bash or zsh shell 20 | * Python 21 | * Python virtualenv package 22 | * SSH client 23 | 24 | Talk to somebody in the room if you don't have these. 25 | 26 | ## Exercises 27 | 28 | * [Getting started][1] 29 | * [Compute][2] 30 | * [Object storage][3] 31 | * [DevStack][4] 32 | * [Dashboard][5] 33 | * [Under the hood: compute][6] 34 | * [Under the hood: volumes][7] 35 | * [Under the hood: networking][8] 36 | * [Cleanup][9] 37 | 38 | 39 | [1]: getting-started.md 40 | [2]: boot-instance.md 41 | [3]: object-storage.md 42 | [4]: devstack.md 43 | [5]: dashboard.md 44 | [6]: under-the-hood-compute.md 45 | [7]: under-the-hood-volumes.md 46 | [8]: under-the-hood-network.md 47 | [9]: cleanup.md -------------------------------------------------------------------------------- /allocate-floating-ip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorin/openstack-hackspace/114023c031b3d72e348f98d267c5b266dde1fac2/allocate-floating-ip.png -------------------------------------------------------------------------------- /boot-instance.md: -------------------------------------------------------------------------------- 1 | # Compute 2 | 3 | Here we're going to create a network, boot an instance onto that network, attach a volume onto 4 | that instance, and then snapshot the instance into an image. 5 | 6 | We'll be using Rackspace Public Cloud, which is implemented on top of OpenStack. 7 | 8 | ## Add a keypair 9 | 10 | First thing we need to do is create a new ssh keypair so that we can ssh to our instances. In these examples, we'll create a new keypair, although you can also upload an existing public key. 11 | 12 | We'll call our key "lisa": 13 | 14 | $ nova keypair-add lisa > lisa.key 15 | 16 | We also need to set permissions on it otherwise ssh won't let us use it. 17 | 18 | $ chmod 0600 lisa.key 19 | 20 | 21 | 22 | ## Networking 23 | 24 | You should have a private and public network visible in your account: 25 | 26 | 27 | $ nova network-list 28 | +--------------------------------------+---------+------+ 29 | | ID | Label | CIDR | 30 | +--------------------------------------+---------+------+ 31 | | 00000000-0000-0000-0000-000000000000 | public | | 32 | | 11111111-1111-1111-1111-111111111111 | private | | 33 | +--------------------------------------+---------+------+ 34 | 35 | We're going to create a new 10.30.0.0/24 network, which we'll call `hackspace`. 36 | 37 | 38 | $ nova network-create hackspace 10.30.0.0/24 39 | +----------+--------------------------------------+ 40 | | Property | Value | 41 | +----------+--------------------------------------+ 42 | | cidr | 10.30.0.0/24 | 43 | | id | 5593dd67-feb4-4382-be86-1b9169ecde65 | 44 | | label | hackspace | 45 | +----------+--------------------------------------+ 46 | 47 | It should now show up in a list of networks: 48 | 49 | $ nova network-list 50 | +--------------------------------------+-----------+--------------+ 51 | | ID | Label | CIDR | 52 | +--------------------------------------+-----------+--------------+ 53 | | 5593dd67-feb4-4382-be86-1b9169ecde65 | hackspace | 10.30.0.0/24 | 54 | | 00000000-0000-0000-0000-000000000000 | public | | 55 | | 11111111-1111-1111-1111-111111111111 | private | | 56 | +--------------------------------------+-----------+--------------+ 57 | 58 | ## Booting a new instance 59 | 60 | Now we're going to boot an Ubuntu 12.04 instance into this network. List the available instance sizes, which OpenStack calls flavors: 61 | 62 | $ nova flavor-list 63 | +----+-------------------------+-----------+------+-----------+------+-------+-------------+-----------+ 64 | | ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public | 65 | +----+-------------------------+-----------+------+-----------+------+-------+-------------+-----------+ 66 | | 2 | 512MB Standard Instance | 512 | 20 | 0 | 512 | 1 | 80.0 | N/A | 67 | | 3 | 1GB Standard Instance | 1024 | 40 | 0 | 1024 | 1 | 120.0 | N/A | 68 | | 4 | 2GB Standard Instance | 2048 | 80 | 0 | 2048 | 2 | 240.0 | N/A | 69 | | 5 | 4GB Standard Instance | 4096 | 160 | 0 | 2048 | 2 | 400.0 | N/A | 70 | | 6 | 8GB Standard Instance | 8192 | 320 | 0 | 2048 | 4 | 600.0 | N/A | 71 | | 7 | 15GB Standard Instance | 15360 | 620 | 0 | 2048 | 6 | 800.0 | N/A | 72 | | 8 | 30GB Standard Instance | 30720 | 1200 | 0 | 2048 | 8 | 1200.0 | N/A | 73 | +----+-------------------------+-----------+------+-----------+------+-------+-------------+-----------+ 74 | 75 | List the available images: 76 | 77 | $ nova image-list 78 | +--------------------------------------+----------------------------------------------------------------------------------------------+--------+--------+ 79 | | ID | Name | Status | Server | 80 | +--------------------------------------+----------------------------------------------------------------------------------------------+--------+--------+ 81 | | ba293687-4af0-4ccb-99e5-097d83f72dfe | Arch 2013.9 | ACTIVE | | 82 | | 9522c27d-51d9-44ee-8eb3-fb7b14fd4042 | CentOS 5.10 | ACTIVE | | 83 | | 59c037c1-70ec-41e4-aa17-73a9b0cb6b16 | CentOS 5.9 | ACTIVE | | 84 | | f70ed7c7-b42e-4d77-83d8-40fa29825b85 | CentOS 6.4 | ACTIVE | | 85 | | 695ca76e-fc0d-4e36-82e0-8ed66480a999 | Debian 6.06 (Squeeze) | ACTIVE | | 86 | | 857d7d36-34f3-409f-8435-693e8797be8b | Debian 7 (Wheezy) | ACTIVE | | 87 | | 896caae3-82f1-4b03-beaa-75fbdde27969 | Fedora 18 (Spherical Cow) | ACTIVE | | 88 | | 8500226f-b193-4471-9eff-9cba8440bfc8 | Fedora 19 (Schrodinger's Cat) | ACTIVE | | 89 | | fb624ffd-81c2-4217-8cd5-da32d32e85c4 | FreeBSD 9.2 | ACTIVE | | 90 | | 73764eb8-3c1c-42a9-8fff-71f6beefc6a7 | Gentoo 13.3 | ACTIVE | | 91 | | 8955d327-9a69-468f-be5c-60f571267406 | OpenSUSE 12.3 | ACTIVE | | 92 | | 56ad2db2-d9cd-462e-a2a4-7f3a4fc91ee8 | Red Hat Enterprise Linux 5.10 | ACTIVE | | 93 | | 9d661e79-e473-4e2c-8a60-06b33b0add67 | Red Hat Enterprise Linux 5.9 | ACTIVE | | 94 | | c6e2fed0-75bf-420d-a744-7cfc75a1889e | Red Hat Enterprise Linux 6.4 | ACTIVE | | 95 | | bced783b-31d2-4637-b820-fa02522c518b | Scientific Linux 6.4 | ACTIVE | | 96 | | aab63bcf-89aa-440f-b0c7-c7a1c611914b | Ubuntu 10.04 LTS (Lucid Lynx) | ACTIVE | | 97 | | c3153cde-2d23-4186-b7da-159adbe2858b | Ubuntu 12.04 LTS (Precise Pangolin) | ACTIVE | | 98 | | ead43b0d-f84f-4bc1-8682-5b6046e69552 | Ubuntu 12.10 (Quantal Quetzal) | ACTIVE | | 99 | | 9e1a83cf-ba21-44b6-8808-5837e291cfe2 | Ubuntu 13.04 (Raring Ringtail) | ACTIVE | | 100 | | 868a0966-0553-42fe-b8b3-5cadc0e0b3c5 | Ubuntu 13.10 (Saucy Salamander) | ACTIVE | | 101 | | 59b394f6-b2e0-4f11-b7d1-7fea4abc60a0 | Vyatta Network OS 6.5R2 | ACTIVE | | 102 | | d7530109-edcf-400f-813c-9e11334a92c1 | Windows Server 2008 R2 SP1 | ACTIVE | | 103 | | 7462c004-59cb-403c-9a8d-823ce978a00c | Windows Server 2008 R2 SP1 (base install without updates) | ACTIVE | | 104 | | d1f37a43-724c-4fd4-b2c2-6f6ed822d5d2 | Windows Server 2008 R2 SP1 + SQL Server 2008 R2 SP2 Standard | ACTIVE | | 105 | | 29950004-52cf-4ef7-8a84-7e9f63b6e06f | Windows Server 2008 R2 SP1 + SQL Server 2008 R2 SP2 Web | ACTIVE | | 106 | | 693f7e97-e723-4e42-bee6-ff4160106fa0 | Windows Server 2008 R2 SP1 + SQL Server 2012 SP1 Standard | ACTIVE | | 107 | | 4f01c063-993a-43ff-b476-3aaf995d969a | Windows Server 2008 R2 SP1 + SQL Server 2012 SP1 Web | ACTIVE | | 108 | | c2f7f30d-6b0f-4d08-af20-cefcc836ecd5 | Windows Server 2008 R2 SP1 + SharePoint 2010 Foundation with SQL Server 2008 R2 Express | ACTIVE | | 109 | | 72b86dd1-6fe5-4890-8f05-f61d30f65246 | Windows Server 2008 R2 SP1 + SharePoint 2010 Foundation with SQL Server 2008 R2 SP1 Standard | ACTIVE | | 110 | | d4f4fc02-299c-4dad-9b85-0576a0336472 | Windows Server 2012 | ACTIVE | | 111 | | 68c3112f-bbef-4a17-9b4c-fb7f7444376f | Windows Server 2012 (base install without updates) | ACTIVE | | 112 | | 41af66f7-6122-48de-b79c-13c98a5febbe | Windows Server 2012 + SQL Server 2012 SP1 Standard | ACTIVE | | 113 | | a68198b3-5bef-4779-a564-3c96f64b8df3 | Windows Server 2012 + SQL Server 2012 SP1 Web | ACTIVE | | 114 | | 639ec81b-35ac-4346-a275-4f31f7bb9504 | Windows Server 2012 + SharePoint 2013 with SQL Server 2012 SP1 Standard | ACTIVE | | 115 | +--------------------------------------+----------------------------------------------------------------------------------------------+--------+--------+ 116 | 117 | 118 | We're going to use flavor `2` (512 MB Standard Instance), and image `c3153cde-2d23-4186-b7da-159adbe2858b` (Ubuntu 12.04). 119 | 120 | 121 | We'll call this instance `web`, and specify that it should be on the `hackspace` network we created, with IP address 10.30.0.5. 122 | 123 | We will use the `--no-service-net` argument so that our instance does not get connected to the private network. 124 | 125 | 126 | $ nova boot --flavor 2 --image c3153cde-2d23-4186-b7da-159adbe2858b --key-name lisa --nic net-id=5593dd67-feb4-4382-be86-1b9169ecde65,v4-fixed-ip=10.30.0.5 web --no-service-net 127 | 128 | Initial output should look like this: 129 | 130 | +------------------------+--------------------------------------+ 131 | | Property | Value | 132 | +------------------------+--------------------------------------+ 133 | | status | BUILD | 134 | | updated | 2013-11-02T02:07:05Z | 135 | | OS-EXT-STS:task_state | scheduling | 136 | | key_name | lisa | 137 | | image | Ubuntu 12.04 LTS (Precise Pangolin) | 138 | | hostId | | 139 | | OS-EXT-STS:vm_state | building | 140 | | flavor | 512MB Standard Instance | 141 | | id | 659fe85d-a59d-4e04-9785-e2942eea1f1b | 142 | | user_id | 97f0118696f24dc18031b5f9a0cfd9df | 143 | | name | web | 144 | | adminPass | 76rGPb8a76ua | 145 | | tenant_id | 869769 | 146 | | created | 2013-11-02T02:07:05Z | 147 | | OS-DCF:diskConfig | AUTO | 148 | | accessIPv4 | | 149 | | accessIPv6 | | 150 | | progress | 0 | 151 | | OS-EXT-STS:power_state | 0 | 152 | | config_drive | | 153 | | metadata | {} | 154 | +------------------------+--------------------------------------+ 155 | 156 | The `nova list` command will give you information about the status. 157 | 158 | +--------------------------------------+------+--------+------------+-------------+-------------------------------------------------------------------------------------+ 159 | | ID | Name | Status | Task State | Power State | Networks | 160 | +--------------------------------------+------+--------+------------+-------------+-------------------------------------------------------------------------------------+ 161 | | 659fe85d-a59d-4e04-9785-e2942eea1f1b | web | BUILD | spawning | NOSTATE | hackspace=10.30.0.2; public=162.209.109.95, 2001:4802:7800:0002:1b1e:746f:ff20:0b7a | 162 | +--------------------------------------+------+--------+------------+-------------+-------------------------------------------------------------------------------------+ 163 | 164 | Eventually, the stauts will become `ACTIVE`: 165 | 166 | +--------------------------------------+------+--------+------------+-------------+-------------------------------------------------------------------------------------+ 167 | | ID | Name | Status | Task State | Power State | Networks | 168 | +--------------------------------------+------+--------+------------+-------------+-------------------------------------------------------------------------------------+ 169 | | 659fe85d-a59d-4e04-9785-e2942eea1f1b | web | ACTIVE | None | Running | hackspace=10.30.0.2; public=162.209.109.95, 2001:4802:7800:0002:1b1e:746f:ff20:0b7a | 170 | +--------------------------------------+------+--------+------------+-------------+-------------------------------------------------------------------------------------+ 171 | 172 | 173 | Once active, you will be able to ssh as root using the lisa.key private key file you created. In the example above, the public IP address is `162.209.109.95`, in your specific case it will be different: 174 | 175 | $ ssh -i lisa.key root@162.209.109.95 176 | Warning: Permanently added '162.209.109.95' (RSA) to the list of known hosts. 177 | Welcome to Ubuntu 12.04.3 LTS (GNU/Linux 3.2.0-53-virtual x86_64) 178 | 179 | * Documentation: https://help.ubuntu.com/ 180 | 181 | System information as of Sat Nov 2 02:08:45 UTC 2013 182 | 183 | System load: 0.08 Processes: 64 184 | Usage of /: 4.9% of 19.68GB Users logged in: 0 185 | Memory usage: 10% IP address for eth0: 162.209.109.95 186 | Swap usage: 0% IP address for eth1: 10.30.0.2 187 | 188 | Graph this data and manage this system at https://landscape.canonical.com/ 189 | 190 | 191 | The programs included with the Ubuntu system are free software; 192 | the exact distribution terms for each program are described in the 193 | individual files in /usr/share/doc/*/copyright. 194 | 195 | Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by 196 | applicable law. 197 | 198 | root@web:~# 199 | 200 | Note that there are two interfaces, eth0 has IP address 162.209.109.95 and is on the `public` network and eth1 has IP address 10.30.0.2 and is on the `hackspace` network. 201 | 202 | Don't forget to log out of the instance: 203 | 204 | 205 | root@web:~# exit 206 | logout 207 | Connection to 162.209.109.95 closed. 208 | 209 | ## Attaching a volume 210 | We're going to attach a 100 GB volume (block device) to our instance. 211 | 212 | First, we create the 100GB volume: 213 | 214 | $ nova volume-create 100 215 | +---------------------+--------------------------------------+ 216 | | Property | Value | 217 | +---------------------+--------------------------------------+ 218 | | status | available | 219 | | display_name | None | 220 | | attachments | [] | 221 | | availability_zone | nova | 222 | | bootable | false | 223 | | created_at | 2013-11-02T02:14:09.000000 | 224 | | display_description | None | 225 | | volume_type | SATA | 226 | | snapshot_id | None | 227 | | source_volid | None | 228 | | size | 100 | 229 | | id | 455ec395-cfab-4319-bbf0-1d061c14a7e8 | 230 | | metadata | {} | 231 | +---------------------+--------------------------------------+ 232 | We should now be able to see it using `nova volume-list` 233 | 234 | $ nova volume-list 235 | +--------------------------------------+-----------+--------------+------+-------------+-------------+ 236 | | ID | Status | Display Name | Size | Volume Type | Attached to | 237 | +--------------------------------------+-----------+--------------+------+-------------+-------------+ 238 | | 455ec395-cfab-4319-bbf0-1d061c14a7e8 | available | None | 100 | SATA | | 239 | +--------------------------------------+-----------+--------------+------+-------------+-------------+ 240 | 241 | We're going to attach this to our `web` instance. We'll use the "auto" argument to let OpenStack select the device file that is associated with the instance. 242 | 243 | $ nova volume-attach web 455ec395-cfab-4319-bbf0-1d061c14a7e8 auto 244 | +----------+--------------------------------------+ 245 | | Property | Value | 246 | +----------+--------------------------------------+ 247 | | device | /dev/xvdb | 248 | | serverId | 659fe85d-a59d-4e04-9785-e2942eea1f1b | 249 | | id | 455ec395-cfab-4319-bbf0-1d061c14a7e8 | 250 | | volumeId | 455ec395-cfab-4319-bbf0-1d061c14a7e8 | 251 | +----------+--------------------------------------+ 252 | 253 | Here we format that volume as an ext4 file system and then mount it as /mnt/vol: 254 | 255 | root@web:~# mkfs.ext4 /dev/xvdb 256 | mke2fs 1.42 (29-Nov-2011) 257 | Filesystem label= 258 | OS type: Linux 259 | Block size=4096 (log=2) 260 | Fragment size=4096 (log=2) 261 | Stride=0 blocks, Stripe width=0 blocks 262 | 6553600 inodes, 26214400 blocks 263 | 1310720 blocks (5.00%) reserved for the super user 264 | First data block=0 265 | Maximum filesystem blocks=4294967296 266 | 800 block groups 267 | 32768 blocks per group, 32768 fragments per group 268 | 8192 inodes per group 269 | Superblock backups stored on blocks: 270 | 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 271 | 4096000, 7962624, 11239424, 20480000, 23887872 272 | 273 | Allocating group tables: done 274 | Writing inode tables: done 275 | Creating journal (32768 blocks): done 276 | Writing superblocks and filesystem accounting information: done 277 | 278 | root@web:~# mkdir /mnt/vol 279 | root@web:~# mount /dev/xvdb /mnt/vol 280 | 281 | We can confirm the size using df: 282 | 283 | root@web:~# df -h /mnt/vol 284 | Filesystem Size Used Avail Use% Mounted on 285 | /dev/xvdb 99G 188M 94G 1% /mnt/vol 286 | 287 | We can also unmount it and then detach it from the instance: 288 | 289 | root@web:~# umount /mnt/vol 290 | root@web:~# exit 291 | logout 292 | Connection to 162.209.109.95 closed. 293 | $ nova volume-detach web 455ec395-cfab-4319-bbf0-1d061c14a7e8 294 | 295 | The volume still exists, and if we had stored any files on it, those files would persist until we deleted the volume: 296 | 297 | $ nova volume-delete 455ec395-cfab-4319-bbf0-1d061c14a7e8 298 | 299 | 300 | ## Capture an instance to an image 301 | 302 | You can capture a running instance to an image, which you can deploy later. 303 | 304 | 305 | $ nova image-create web web-snapshot 306 | 307 | It will take a while to snapshot the instance to an image. You can check 308 | the status: 309 | 310 | 311 | $ nova image-show web-snapshot 312 | +------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 313 | | Property | Value | 314 | +------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 315 | | metadata com.rackspace__1__visible_rackconnect | 0 | 316 | | metadata com.rackspace__1__visible_core | 0 | 317 | | metadata instance_uuid | 659fe85d-a59d-4e04-9785-e2942eea1f1b | 318 | | metadata com.rackspace__1__options | 0 | 319 | | metadata com.rackspace__1__release_id | 1003 | 320 | | metadata com.rackspace__1__release_build_date | 2013-10-03_08-56-47 | 321 | | metadata com.rackspace__1__build_rackconnect | 1 | 322 | | metadata instance_type_swap | 512 | 323 | | metadata instance_type_memory_mb | 512 | 324 | | id | dfef31c2-d0dc-4644-9c53-d45963115310 | 325 | | metadata org.openstack__1__os_distro | com.ubuntu | 326 | | metadata com.rackspace__1__visible_managed | 0 | 327 | | metadata instance_type_rxtx_factor | 80 | 328 | | metadata os_type | linux | 329 | | metadata image_type | snapshot | 330 | | OS-DCF:diskConfig | AUTO | 331 | | metadata password_0 | RJZbqpD8bgj4TlyceXQ0WUASFIuFYkHIT30/TlWEgIEwqwfv5PAUJuDWCDbKuSEN7sZSiJfF3LTb+2ibyb3UoIgiA9KWQIbL3TuyxrchSyEZRQI3HZQn/2GQNFgif8Nr7769krmtdTvZDxaV+ZOW7JMZGn2Mcs2NTzvYE/7jQEvRA4k7LmUVfqBVbBNk5EXhgWfY3Guc7YulJ+bGsyBvroVY7RVTztFsFnaVq0XXnnROPt+bbmJBepgm+U1f7UI | 332 | | metadata password_1 | pkPyw++QUOr09k9YLj9PrsgF3IvXb33UgWUw/FRtbjyAKqskGcTH5gsxX9SnLUhsE3V1sVUVr97jBDfvgsA5wNw== | 333 | | minRam | 512 | 334 | | status | SAVING | 335 | | metadata os_distro | ubuntu | 336 | | updated | 2013-11-02T04:27:28Z | 337 | | metadata instance_type_id | 2 | 338 | | metadata instance_type_vcpu_weight | 10 | 339 | | metadata org.openstack__1__architecture | x64 | 340 | | metadata com.rackspace__1__build_core | 1 | 341 | | metadata base_image_ref | 25de7af5-1668-46fb-bd08-9974b63a4806 | 342 | | metadata com.rackspace__1__build_managed | 1 | 343 | | metadata com.rackspace__1__release_version | 7 | 344 | | metadata org.openstack__1__os_version | 12.04 | 345 | | metadata instance_type_name | 512MB Standard Instance | 346 | | progress | 50 | 347 | | metadata instance_type_flavorid | 2 | 348 | | name | web-snapshot | 349 | | metadata instance_type_vcpus | 1 | 350 | | metadata user_id | 97f0118696f24dc18031b5f9a0cfd9df | 351 | | OS-EXT-IMG-SIZE:size | 0 | 352 | | created | 2013-11-02T04:27:21Z | 353 | | minDisk | 20 | 354 | | server | 659fe85d-a59d-4e04-9785-e2942eea1f1b | 355 | | metadata instance_type_root_gb | 20 | 356 | | metadata auto_disk_config | True | 357 | | metadata com.rackspace__1__source | kickstart | 358 | | metadata instance_type_ephemeral_gb | 0 | 359 | +------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 360 | 361 | Next exercise is [object storage]. 362 | 363 | [object storage]: object-storage.md 364 | 365 | -------------------------------------------------------------------------------- /cleanup.md: -------------------------------------------------------------------------------- 1 | # Clean up 2 | 3 | ## Instances 4 | 5 | Make sure there are no instances running: 6 | 7 | $ nova list 8 | 9 | If there are, delete them: 10 | 11 | $ nova delete devstack 12 | 13 | ## Networks 14 | 15 | Make sure the only networks that remain are `public` and `private`: 16 | 17 | $ nova network-list 18 | 19 | If there are other networks, delete them: 20 | 21 | $ nova network-delete hackspace 22 | 23 | ## Volumes 24 | 25 | Make sure there are no volumes remainig: 26 | 27 | $ nova volume-list 28 | 29 | If there are, delete them: 30 | 31 | $ nova volume-delete 455ec395-cfab-4319-bbf0-1d061c14a7e8 32 | 33 | ## Images 34 | 35 | Make sure there are no images you created remaining: 36 | 37 | $ nova image-list 38 | 39 | If there are images you created, delete them: 40 | 41 | $ nova image-delete web-snapshot 42 | 43 | ## Object storage 44 | 45 | Make sure there are no containers remaining: 46 | 47 | $ swift list 48 | 49 | If there are, delete them: 50 | 51 | $ swift delete hackspace 52 | -------------------------------------------------------------------------------- /dashboard.md: -------------------------------------------------------------------------------- 1 | # Dashboard 2 | 3 | In this exercise, you will use the OpenStack Dashboard to create a new security 4 | group, start an instance, attach a floating IP, and attach a volume. 5 | 6 | You should now be able to access the dashboard by pointing your web browser 7 | at the public IP of your instance. 8 | 9 | * Username: demo 10 | * Password: (see `ADMIN_PASSWORD` variable in `/opt/stack/devstack/localrc`) 11 | 12 | ## Create a security group that allows ssh and ping 13 | 14 | We are going to create a new security group that only allows ssh (port 22) 15 | and ping (icmp) traffic. 16 | 17 | 18 | 1. Click "CURRENT PROJECT" at the left and select "demo" 19 | 20 | 1. Click "Access & Security" at the left. 21 | 22 | 1. Click "Create Security Group" 23 | 24 | 1. Fill in the following fields: 25 | * Name: ssh 26 | * Description: allow ssh and ping 27 | 28 | 1. Click "Create Security Group" 29 | 30 | It may take a few seconds, but eventually the new security group will 31 | appear in the Security Groups table. 32 | 33 | 1. Click "Edit Rules" on the "ssh" Security group 34 | 35 | 1. Click "Add Rule" 36 | 37 | 1. Fill in the following fields: 38 | * Rule: Custom TCP Rule 39 | * Direction: Ingress 40 | * Open Port: Port 41 | * Port: 22 42 | * Remote: CDIR 43 | * CIDR: 0.0.0.0/0 44 | 45 | 1. Click "Add" 46 | 47 | 1. Click "Add Rule" 48 | 49 | 1. Fill in the following fields 50 | * Rule: ALL ICMP 51 | * Direction: Ingress 52 | * Remote: CIDR 53 | * CIDR: 0.0.0.0/0 54 | 55 | 1. Click "Add" 56 | 57 | 58 | 59 | ## Launch an instance inside of DevStack 60 | 61 | Make sure the CURRENT project is on "demo". 62 | 63 | 64 | 1. Click the "Instances" link on the left, and click "Launch instance" at the top-right 65 | * Availability Zone: nova 66 | * Instance Name: test 67 | * Flavor: m1.tiny 68 | * Instance Count: 1 69 | * Instance Boot Source: Boot from image. 70 | * Image Name: cirros-0.3.1-x86_64-uec (24.0 MB) 71 | 72 | ![launch instance](launch-instance.png) 73 | 74 | 1. Click "Access & Security" 75 | 76 | 1. Under "Security Groups", select "ssh" and unselect "default" 77 | 78 | We aren't going to specify a keypair in this case, since we'll be logging 79 | into the instance with user name and password. However, in typical usage, 80 | you'd specify a public ssh key that you'd use to ssh into it. 81 | 82 | 1. Click "Networking" 83 | 84 | 1. Click the blue "+" on the "private" in "Available networks". It should move to "Selected Networks" 85 | 86 | ![launch instance net](launch-instance-net.png) 87 | 88 | 1. Click "Launch" 89 | 90 | ## Allocate a floating IP and attach to an instance 91 | 92 | By default, OpenStack instances aren't reachable without a floating IP. 93 | 94 | 95 | 1. At the "Instances" view, click "More" under Actions and choose "Associate 96 | floating IP". 97 | tw 98 | ![associate floating ip](menu-associate-floating-ip.png) 99 | 100 | 1. Click the "+" next to "No IP addresses available" to alllocate a new 101 | floating IP. 102 | 103 | ![allocate floating ip](allocate-floating-ip.png) 104 | 105 | 1. Click "Allocate IP" to allocate an IP address from the "public" pool. 106 | 107 | 1. Click "Associate" to associate the IP address with the instance. 108 | 109 | 1. Wait a few seconds, then reload your web browser 110 | 111 | You should eventually see two IP addresses in the "IP address field which are most likely: 112 | 113 | * 10.0.0.3 114 | * 172.24.4.227 115 | 116 | `10.0.0.3` is your fixed IP, and `172.24.4.227` if your floating IP. 117 | 118 | Try to ssh to the floating IP address: 172.24.4.227 as the user `cirros`: 119 | 120 | $ ssh cirros@172.24.4.227 121 | 122 | 123 | The password is: `cubswin:)` 124 | 125 | You should see the following output: 126 | 127 | The authenticity of host '172.24.4.227 (172.24.4.227)' can't be established. 128 | RSA key fingerprint is b4:6f:8b:86:e8:8b:73:56:ac:3d:c2:ab:57:7e:eb:7f. 129 | Are you sure you want to continue connecting (yes/no)? yes 130 | Warning: Permanently added '172.24.4.227' (RSA) to the list of known hosts. 131 | cirros@172.24.4.227's password: 132 | $ 133 | 134 | ## Create and attach a volume 135 | 136 | In the dashboard: 137 | 138 | 1. Click "Volumes" at the left 139 | 1. Click "Create Volume" 140 | 1. Name it "myvolume", of size 1 GB. Leave other values as defaults. 141 | 1. Click "Create Volume" 142 | 143 | When the volume status becomes "Available": 144 | 145 | 1. Click "Edit Attachments" 146 | 1. Select "test" as the instance 147 | 1. Specify "/dev/vdb" as the device name 148 | 1. Click "Attach Volume" 149 | 150 | Inside of your cirros instance, you should now see a /dev/vdb device. You can 151 | format it and mount it as a drive. 152 | 153 | $ sudo mkfs.ext4 /dev/vdb 154 | $ sudo mount /dev/vdb /mnt 155 | 156 | Exit the cirros instance: 157 | 158 | $ exit 159 | 160 | 161 | ## Add a file to object store 162 | 163 | In the dashboard: 164 | 165 | 1. Click "Containers" at the left 166 | 1. Click the "Create Container" button 167 | 1. Name it "mycontainer" 168 | 1. Click the "Upload Object" button 169 | 1. Set Object Name: logo.png, click "Browse..." and choose the Openstack logo file downloaded earlier. 170 | 1. Click "Upload Object" button. 171 | 172 | The "logo.png" file should appear in the dashboard. 173 | 174 | 175 | For the rest of the exercises, make sure you are logged in to the Rackspace 176 | virtual machine instance ("devstack") when issuing the commands. 177 | 178 | Next exercise is the [Under the hood: compute]. 179 | 180 | [Under the hood: compute]: under-the-hood-compute.md 181 | -------------------------------------------------------------------------------- /devstack.md: -------------------------------------------------------------------------------- 1 | # DevStack 2 | 3 | DevStack is a single-node OpenStack deployment intended for development use. 4 | In this exercise, we'll do a DevStack deployment of the Havana release of 5 | OpenStack. 6 | 7 | We'll be using this DevStack deployment for the additional exercises as well. 8 | 9 | ## Launch an instance on Rackspace 10 | 11 | We'll use an 8GB standard instance on Ubuntu 12.04: 12 | 13 | $ nova boot --flavor 6 --image c3153cde-2d23-4186-b7da-159adbe2858b --key-name lisa devstack 14 | 15 | Output should look like: 16 | 17 | +------------------------+--------------------------------------+ 18 | | Property | Value | 19 | +------------------------+--------------------------------------+ 20 | | status | BUILD | 21 | | updated | 2013-11-04T04:15:56Z | 22 | | OS-EXT-STS:task_state | scheduling | 23 | | key_name | lisa | 24 | | image | Ubuntu 12.04 LTS (Precise Pangolin) | 25 | | hostId | | 26 | | OS-EXT-STS:vm_state | building | 27 | | flavor | 8GB Standard Instance | 28 | | id | 7643b6d2-5782-435a-9056-1e82ac51c853 | 29 | | user_id | 97f0118696f24dc18031b5f9a0cfd9df | 30 | | name | devstack | 31 | | adminPass | Y9FPzmiVbnF9 | 32 | | tenant_id | 869769 | 33 | | created | 2013-11-04T04:15:56Z | 34 | | OS-DCF:diskConfig | AUTO | 35 | | accessIPv4 | | 36 | | accessIPv6 | | 37 | | progress | 0 | 38 | | OS-EXT-STS:power_state | 0 | 39 | | config_drive | | 40 | | metadata | {} | 41 | +------------------------+--------------------------------------+ 42 | 43 | You can check the status by doing: 44 | 45 | $ nova show devstack 46 | 47 | The "progress" field will tell you the % complete. When the status reaches 48 | `ACTIVE`, the server is ready. 49 | 50 | ## SSH into the instance 51 | 52 | If the IP address is 162.209.96.154, ssh by doing: 53 | 54 | $ ssh -i lisa.key root@162.209.96.154 55 | 56 | ## Install git 57 | 58 | Once inside the instance, install git: 59 | 60 | # apt-get install -y git 61 | 62 | ## Grab DevStack 63 | 64 | Grab DevStack and switch to the stable/havana branch: 65 | 66 | # git clone https://github.com/openstack-dev/devstack.git -b stable/havana 67 | 68 | ## Create a "stack" user 69 | 70 | DevStack can't run as root, so create a "stack" user using the script that 71 | comes with DevStack: 72 | 73 | # chmod +x /root/devstack/tools/create-stack-user.sh 74 | # /root/devstack/tools/create-stack-user.sh 75 | 76 | Output should be: 77 | 78 | Creating a group called stack 79 | Creating a user called stack 80 | Giving stack user passwordless sudo privileges 81 | 82 | ## Switch to the stack user 83 | 84 | # sudo -u stack -i 85 | 86 | ## Check out devstack as stack user 87 | 88 | $ git clone https://github.com/openstack-dev/devstack.git -b stable/havana 89 | 90 | 91 | ## Create /opt/stack/devstack/local.conf 92 | 93 | Create `/opt/stack/devstack/local.conf` with the following contents: 94 | 95 | 96 | ``` 97 | [[local|localrc]] 98 | SCREEN_LOGDIR=/opt/stack/logs 99 | 100 | # Enable Neutron 101 | disable_service n-net 102 | enable_service q-svc 103 | enable_service q-agt 104 | enable_service q-dhcp 105 | enable_service q-l3 106 | enable_service q-meta 107 | enable_service neutron 108 | 109 | # Use Neutron for security groups 110 | LIBVIRT_FIREWALL_DRIVER=nova.virt.firewall.NoopFirewallDriver 111 | Q_USE_SECGROUP=True 112 | 113 | # Enable Swift 114 | enable_service s-proxy 115 | enable_service s-object 116 | enable_service s-container 117 | enable_service s-account 118 | 119 | # Disable tempest 120 | disable_service tempest 121 | ``` 122 | 123 | 124 | ## Run stack.sh as stack user 125 | 126 | $ cd ~/devstack 127 | $ ./stack.sh 128 | 129 | Hit enter each time it asks you a question about specifying a password to 130 | tell DevStack to just generate passwords randomly. 131 | 132 | It will then proceed to install OpenStack on the single node. This will take 133 | about twelve minutes. The output should look like this, with a different 134 | IP address. 135 | 136 | Horizon is now available at http://162.209.96.154/ 137 | Keystone is serving at http://162.209.96.154:5000/v2.0/ 138 | Examples on using novaclient command line is in exercise.sh 139 | The default users are: admin and demo 140 | The password: 08a85950ecd4cff5e631 141 | This is your host ip: 162.209.96.154 142 | stack.sh completed in 743 seconds. 143 | 144 | The password is also set as `ADMIN_PASSWORD` in the localrc file. 145 | 146 | Next exercise is the [Dashboard]. 147 | 148 | [Dashboard]: dashboard.md 149 | -------------------------------------------------------------------------------- /diagrams.graffle: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ActiveLayerIndex 6 | 0 7 | ApplicationVersion 8 | 9 | com.omnigroup.OmniGrafflePro.MacAppStore 10 | 139.18 11 | 12 | AutoAdjust 13 | 14 | BackgroundGraphic 15 | 16 | Bounds 17 | {{0, 0}, {576, 733}} 18 | Class 19 | SolidGraphic 20 | ID 21 | 2 22 | Style 23 | 24 | shadow 25 | 26 | Draws 27 | NO 28 | 29 | stroke 30 | 31 | Draws 32 | NO 33 | 34 | 35 | 36 | BaseZoom 37 | 0 38 | CanvasOrigin 39 | {0, 0} 40 | ColumnAlign 41 | 1 42 | ColumnSpacing 43 | 36 44 | CreationDate 45 | 2013-11-06 01:13:34 +0000 46 | Creator 47 | Lorin Hochstein 48 | DisplayScale 49 | 1 0/72 in = 1 0/72 in 50 | GraphDocumentVersion 51 | 8 52 | GraphicsList 53 | 54 | 55 | Bounds 56 | {{430.5, 579.21875}, {127, 14}} 57 | Class 58 | ShapedGraphic 59 | FitText 60 | YES 61 | Flow 62 | Resize 63 | FontInfo 64 | 65 | Font 66 | Helvetica 67 | Size 68 | 12 69 | 70 | ID 71 | 64 72 | Shape 73 | Rectangle 74 | Style 75 | 76 | fill 77 | 78 | Draws 79 | NO 80 | 81 | shadow 82 | 83 | Draws 84 | NO 85 | 86 | stroke 87 | 88 | Draws 89 | NO 90 | 91 | 92 | Text 93 | 94 | Pad 95 | 0 96 | Text 97 | {\rtf1\ansi\ansicpg1252\cocoartf1265 98 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 99 | {\colortbl;\red255\green255\blue255;} 100 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 101 | 102 | \f0\b\fs24 \cf0 Not used by DevStack} 103 | VerticalPad 104 | 0 105 | 106 | Wrap 107 | NO 108 | 109 | 110 | Bounds 111 | {{2, 564}, {569, 166}} 112 | Class 113 | ShapedGraphic 114 | ID 115 | 63 116 | Shape 117 | Rectangle 118 | Style 119 | 120 | fill 121 | 122 | Draws 123 | NO 124 | 125 | stroke 126 | 127 | Pattern 128 | 1 129 | 130 | 131 | 132 | 133 | Bounds 134 | {{415, 322}, {61, 14}} 135 | Class 136 | ShapedGraphic 137 | FitText 138 | YES 139 | Flow 140 | Resize 141 | ID 142 | 60 143 | Shape 144 | Rectangle 145 | Style 146 | 147 | fill 148 | 149 | Draws 150 | NO 151 | 152 | shadow 153 | 154 | Draws 155 | NO 156 | 157 | stroke 158 | 159 | Draws 160 | NO 161 | 162 | 163 | Text 164 | 165 | Align 166 | 0 167 | Pad 168 | 0 169 | Text 170 | {\rtf1\ansi\ansicpg1252\cocoartf1265 171 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 172 | {\colortbl;\red255\green255\blue255;} 173 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural 174 | 175 | \f0\fs24 \cf0 10.0.0.2/24} 176 | VerticalPad 177 | 0 178 | 179 | Wrap 180 | NO 181 | 182 | 183 | Bounds 184 | {{213.5, 602}, {87, 14}} 185 | Class 186 | ShapedGraphic 187 | FitText 188 | YES 189 | Flow 190 | Resize 191 | ID 192 | 55 193 | Shape 194 | Rectangle 195 | Style 196 | 197 | fill 198 | 199 | Draws 200 | NO 201 | 202 | shadow 203 | 204 | Draws 205 | NO 206 | 207 | stroke 208 | 209 | Draws 210 | NO 211 | 212 | 213 | Text 214 | 215 | Align 216 | 0 217 | Pad 218 | 0 219 | Text 220 | {\rtf1\ansi\ansicpg1252\cocoartf1265 221 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 222 | {\colortbl;\red255\green255\blue255;} 223 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural 224 | 225 | \f0\fs24 \cf0 10.176.67.33/18} 226 | VerticalPad 227 | 0 228 | 229 | Wrap 230 | NO 231 | 232 | 233 | Bounds 234 | {{35.5, 591}, {107, 14}} 235 | Class 236 | ShapedGraphic 237 | FitText 238 | YES 239 | Flow 240 | Resize 241 | ID 242 | 54 243 | Shape 244 | Rectangle 245 | Style 246 | 247 | fill 248 | 249 | Draws 250 | NO 251 | 252 | shadow 253 | 254 | Draws 255 | NO 256 | 257 | stroke 258 | 259 | Draws 260 | NO 261 | 262 | 263 | Text 264 | 265 | Align 266 | 0 267 | Pad 268 | 0 269 | Text 270 | {\rtf1\ansi\ansicpg1252\cocoartf1265 271 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 272 | {\colortbl;\red255\green255\blue255;} 273 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural 274 | 275 | \f0\fs24 \cf0 162.209.104.176/24} 276 | VerticalPad 277 | 0 278 | 279 | Wrap 280 | NO 281 | 282 | 283 | Bounds 284 | {{215.5, 704.25}, {103, 14}} 285 | Class 286 | ShapedGraphic 287 | FitText 288 | YES 289 | Flow 290 | Resize 291 | ID 292 | 53 293 | Shape 294 | Rectangle 295 | Style 296 | 297 | fill 298 | 299 | Draws 300 | NO 301 | 302 | shadow 303 | 304 | Draws 305 | NO 306 | 307 | stroke 308 | 309 | Draws 310 | NO 311 | 312 | 313 | Text 314 | 315 | Pad 316 | 0 317 | Text 318 | {\rtf1\ansi\ansicpg1252\cocoartf1265 319 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 320 | {\colortbl;\red255\green255\blue255;} 321 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 322 | 323 | \f0\fs24 \cf0 private (rackspace)} 324 | VerticalPad 325 | 0 326 | 327 | Wrap 328 | NO 329 | 330 | 331 | Bounds 332 | {{35.5, 680}, {98, 14}} 333 | Class 334 | ShapedGraphic 335 | FitText 336 | YES 337 | Flow 338 | Resize 339 | ID 340 | 52 341 | Shape 342 | Rectangle 343 | Style 344 | 345 | fill 346 | 347 | Draws 348 | NO 349 | 350 | shadow 351 | 352 | Draws 353 | NO 354 | 355 | stroke 356 | 357 | Draws 358 | NO 359 | 360 | 361 | Text 362 | 363 | Pad 364 | 0 365 | Text 366 | {\rtf1\ansi\ansicpg1252\cocoartf1265 367 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 368 | {\colortbl;\red255\green255\blue255;} 369 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 370 | 371 | \f0\fs24 \cf0 public (rackspace)} 372 | VerticalPad 373 | 0 374 | 375 | Wrap 376 | NO 377 | 378 | 379 | Class 380 | LineGraphic 381 | Head 382 | 383 | ID 384 | 49 385 | Position 386 | 0.5 387 | 388 | ID 389 | 51 390 | Points 391 | 392 | {261, 656.625} 393 | {261, 698.375} 394 | 395 | Style 396 | 397 | stroke 398 | 399 | HeadArrow 400 | 0 401 | Legacy 402 | 403 | TailArrow 404 | 0 405 | 406 | 407 | Tail 408 | 409 | ID 410 | 45 411 | 412 | 413 | 414 | Class 415 | LineGraphic 416 | Head 417 | 418 | ID 419 | 47 420 | Position 421 | 0.50434780120849609 422 | 423 | ID 424 | 50 425 | Points 426 | 427 | {84.699998539924565, 644.74997080070409} 428 | {84.999997138977051, 672.5} 429 | 430 | Style 431 | 432 | stroke 433 | 434 | HeadArrow 435 | 0 436 | Legacy 437 | 438 | TailArrow 439 | 0 440 | 441 | 442 | Tail 443 | 444 | ID 445 | 44 446 | 447 | 448 | 449 | Class 450 | LineGraphic 451 | ID 452 | 49 453 | Points 454 | 455 | {203.5, 698.375} 456 | {318.5, 698.375} 457 | 458 | Style 459 | 460 | stroke 461 | 462 | HeadArrow 463 | 0 464 | Legacy 465 | 466 | TailArrow 467 | 0 468 | Width 469 | 3 470 | 471 | 472 | 473 | 474 | Class 475 | LineGraphic 476 | ID 477 | 47 478 | Points 479 | 480 | {27, 672.5} 481 | {142, 672.5} 482 | 483 | Style 484 | 485 | stroke 486 | 487 | HeadArrow 488 | 0 489 | Legacy 490 | 491 | TailArrow 492 | 0 493 | Width 494 | 3 495 | 496 | 497 | 498 | 499 | Bounds 500 | {{412, 641}, {87, 36}} 501 | Class 502 | ShapedGraphic 503 | ID 504 | 46 505 | Shape 506 | RoundRect 507 | Style 508 | 509 | Text 510 | 511 | Text 512 | {\rtf1\ansi\ansicpg1252\cocoartf1265 513 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 514 | {\colortbl;\red255\green255\blue255;} 515 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 516 | 517 | \f0\fs24 \cf0 virbr0} 518 | 519 | 520 | 521 | Bounds 522 | {{239, 620.125}, {44, 36}} 523 | Class 524 | ShapedGraphic 525 | ID 526 | 45 527 | Shape 528 | Rectangle 529 | Text 530 | 531 | Text 532 | {\rtf1\ansi\ansicpg1252\cocoartf1265 533 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 534 | {\colortbl;\red255\green255\blue255;} 535 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 536 | 537 | \f0\fs24 \cf0 eth1} 538 | 539 | 540 | 541 | Bounds 542 | {{62.5, 608.25}, {44, 36}} 543 | Class 544 | ShapedGraphic 545 | ID 546 | 44 547 | Shape 548 | Rectangle 549 | Text 550 | 551 | Text 552 | {\rtf1\ansi\ansicpg1252\cocoartf1265 553 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 554 | {\colortbl;\red255\green255\blue255;} 555 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 556 | 557 | \f0\fs24 \cf0 eth0} 558 | 559 | 560 | 561 | Bounds 562 | {{382, 82}, {44, 14}} 563 | Class 564 | ShapedGraphic 565 | FitText 566 | YES 567 | Flow 568 | Resize 569 | ID 570 | 43 571 | Shape 572 | Rectangle 573 | Style 574 | 575 | fill 576 | 577 | Draws 578 | NO 579 | 580 | shadow 581 | 582 | Draws 583 | NO 584 | 585 | stroke 586 | 587 | Draws 588 | NO 589 | 590 | 591 | Text 592 | 593 | Align 594 | 0 595 | Pad 596 | 0 597 | Text 598 | {\rtf1\ansi\ansicpg1252\cocoartf1265 599 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 600 | {\colortbl;\red255\green255\blue255;} 601 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural 602 | 603 | \f0\fs24 \cf0 10.0.0.3} 604 | VerticalPad 605 | 0 606 | 607 | Wrap 608 | NO 609 | 610 | 611 | Bounds 612 | {{247, 517.4375}, {28, 14}} 613 | Class 614 | ShapedGraphic 615 | FitText 616 | YES 617 | Flow 618 | Resize 619 | ID 620 | 42 621 | Shape 622 | Rectangle 623 | Style 624 | 625 | fill 626 | 627 | Draws 628 | NO 629 | 630 | shadow 631 | 632 | Draws 633 | NO 634 | 635 | stroke 636 | 637 | Draws 638 | NO 639 | 640 | 641 | Text 642 | 643 | Pad 644 | 0 645 | Text 646 | {\rtf1\ansi\ansicpg1252\cocoartf1265 647 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 648 | {\colortbl;\red255\green255\blue255;} 649 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 650 | 651 | \f0\fs24 \cf0 br-ex} 652 | VerticalPad 653 | 0 654 | 655 | Wrap 656 | NO 657 | 658 | 659 | Bounds 660 | {{116, 516}, {87, 14}} 661 | Class 662 | ShapedGraphic 663 | FitText 664 | YES 665 | Flow 666 | Resize 667 | ID 668 | 41 669 | Shape 670 | Rectangle 671 | Style 672 | 673 | fill 674 | 675 | Draws 676 | NO 677 | 678 | shadow 679 | 680 | Draws 681 | NO 682 | 683 | stroke 684 | 685 | Draws 686 | NO 687 | 688 | 689 | Text 690 | 691 | Align 692 | 0 693 | Pad 694 | 0 695 | Text 696 | {\rtf1\ansi\ansicpg1252\cocoartf1265 697 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 698 | {\colortbl;\red255\green255\blue255;} 699 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural 700 | 701 | \f0\fs24 \cf0 172.24.4.227/32} 702 | VerticalPad 703 | 0 704 | 705 | Wrap 706 | NO 707 | 708 | 709 | Bounds 710 | {{116, 502}, {87, 14}} 711 | Class 712 | ShapedGraphic 713 | FitText 714 | YES 715 | Flow 716 | Resize 717 | ID 718 | 40 719 | Shape 720 | Rectangle 721 | Style 722 | 723 | fill 724 | 725 | Draws 726 | NO 727 | 728 | shadow 729 | 730 | Draws 731 | NO 732 | 733 | stroke 734 | 735 | Draws 736 | NO 737 | 738 | 739 | Text 740 | 741 | Align 742 | 0 743 | Pad 744 | 0 745 | Text 746 | {\rtf1\ansi\ansicpg1252\cocoartf1265 747 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 748 | {\colortbl;\red255\green255\blue255;} 749 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural 750 | 751 | \f0\fs24 \cf0 172.24.4.226/28} 752 | VerticalPad 753 | 0 754 | 755 | Wrap 756 | NO 757 | 758 | 759 | Bounds 760 | {{175, 322}, {61, 14}} 761 | Class 762 | ShapedGraphic 763 | FitText 764 | YES 765 | Flow 766 | Resize 767 | ID 768 | 39 769 | Shape 770 | Rectangle 771 | Style 772 | 773 | fill 774 | 775 | Draws 776 | NO 777 | 778 | shadow 779 | 780 | Draws 781 | NO 782 | 783 | stroke 784 | 785 | Draws 786 | NO 787 | 788 | 789 | Text 790 | 791 | Align 792 | 0 793 | Pad 794 | 0 795 | Text 796 | {\rtf1\ansi\ansicpg1252\cocoartf1265 797 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 798 | {\colortbl;\red255\green255\blue255;} 799 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural 800 | 801 | \f0\fs24 \cf0 10.0.0.1/24} 802 | VerticalPad 803 | 0 804 | 805 | Wrap 806 | NO 807 | 808 | 809 | Bounds 810 | {{154.5, 381.75}, {85, 56}} 811 | Class 812 | ShapedGraphic 813 | FitText 814 | YES 815 | Flow 816 | Resize 817 | ID 818 | 26 819 | Shape 820 | Rectangle 821 | Style 822 | 823 | fill 824 | 825 | Draws 826 | NO 827 | 828 | shadow 829 | 830 | Draws 831 | NO 832 | 833 | stroke 834 | 835 | Draws 836 | NO 837 | 838 | 839 | Text 840 | 841 | Pad 842 | 0 843 | Text 844 | {\rtf1\ansi\ansicpg1252\cocoartf1265 845 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 846 | {\colortbl;\red255\green255\blue255;} 847 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 848 | 849 | \f0\fs24 \cf0 qrouter-\ 850 | 9e5f2802-2462-\ 851 | 4f5c-a95b-\ 852 | c60b99744451} 853 | VerticalPad 854 | 0 855 | 856 | Wrap 857 | NO 858 | 859 | 860 | Bounds 861 | {{143, 336}, {121, 24}} 862 | Class 863 | ShapedGraphic 864 | ID 865 | 38 866 | Shape 867 | Rectangle 868 | Text 869 | 870 | Text 871 | {\rtf1\ansi\ansicpg1252\cocoartf1265 872 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 873 | {\colortbl;\red255\green255\blue255;} 874 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 875 | 876 | \f0\fs24 \cf0 qr-0d5ea29d-36} 877 | 878 | 879 | 880 | Bounds 881 | {{341, 517.4375}, {111, 14}} 882 | Class 883 | ShapedGraphic 884 | FitText 885 | YES 886 | Flow 887 | Resize 888 | ID 889 | 37 890 | Shape 891 | Rectangle 892 | Style 893 | 894 | fill 895 | 896 | Draws 897 | NO 898 | 899 | shadow 900 | 901 | Draws 902 | NO 903 | 904 | stroke 905 | 906 | Draws 907 | NO 908 | 909 | 910 | Text 911 | 912 | Pad 913 | 0 914 | Text 915 | {\rtf1\ansi\ansicpg1252\cocoartf1265 916 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 917 | {\colortbl;\red255\green255\blue255;} 918 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 919 | 920 | \f0\fs24 \cf0 Open vSwitch bridge} 921 | VerticalPad 922 | 0 923 | 924 | Wrap 925 | NO 926 | 927 | 928 | Bounds 929 | {{112, 476.875}, {121, 24}} 930 | Class 931 | ShapedGraphic 932 | ID 933 | 34 934 | Shape 935 | Rectangle 936 | Text 937 | 938 | Text 939 | {\rtf1\ansi\ansicpg1252\cocoartf1265 940 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 941 | {\colortbl;\red255\green255\blue255;} 942 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 943 | 944 | \f0\fs24 \cf0 qg-411a1cf8-f4} 945 | 946 | 947 | 948 | Bounds 949 | {{385, 336}, {121, 24}} 950 | Class 951 | ShapedGraphic 952 | ID 953 | 29 954 | Shape 955 | Rectangle 956 | Text 957 | 958 | RTFD 959 | 960 | BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0 961 | ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp 962 | bmcBlIQBKwPvv7yGhAJpSQEBkoSEhAxOU0RpY3Rpb25h 963 | cnkAlIQBaQKShJaWEE5TUGFyYWdyYXBoU3R5bGWGkoSE 964 | hBdOU011dGFibGVQYXJhZ3JhcGhTdHlsZQCEhBBOU1Bh 965 | cmFncmFwaFN0eWxlAJSEBENDQFMCAIUAhpKElpYMTlNB 966 | dHRhY2htZW50hpKEhIQQTlNUZXh0QXR0YWNobWVudACU 967 | hAJjQACEhIQNTlNGaWxlV3JhcHBlci6UkoSEhA1OU011 968 | dGFibGVEYXRhAISEBk5TRGF0YQCUmYGGMIQIWzEyNDIy 969 | Y11ydGZkAAAAAAMAAAAEAAAAAgAAAC4uEwAAAF9fQFBy 970 | ZWZlcnJlZE5hbWVAX18XAAAAX19AVVRGOFByZWZlcnJl 971 | ZE5hbWVAX18BAAAALssvAAAcAAAAHAAAACYAAAABAAAA 972 | AAAAgCggAACTDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 973 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 974 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 975 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 976 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 977 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 978 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 979 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 980 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 981 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 982 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 983 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 984 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 985 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 986 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 987 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 988 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 989 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 990 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 991 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 992 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 993 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 994 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 995 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 996 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 997 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 998 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 999 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1000 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1001 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1002 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1003 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1004 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1005 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1006 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1007 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1008 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1009 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1010 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1011 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1012 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1013 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1014 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1015 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1016 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1017 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1018 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1019 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1020 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1021 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1022 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1023 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1024 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1025 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1026 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1027 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1028 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1029 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1030 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1031 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1032 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1033 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1034 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1035 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1036 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1037 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1038 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1039 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1040 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1041 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1042 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1043 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1044 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1045 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1046 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1047 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1048 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1049 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1050 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1051 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1052 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1053 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1054 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1055 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1056 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1057 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1058 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1059 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1060 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1061 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1062 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1063 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1064 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1065 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1066 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1067 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1068 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1069 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1070 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1071 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1072 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1073 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1074 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1075 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1076 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1077 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1078 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1079 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1080 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1081 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1082 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1083 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1084 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1085 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1086 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1087 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1088 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1089 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1090 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1091 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1092 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1093 | AAAAAAAAJVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBv 1094 | YmoKPDwgL0xlbmd0aCA1IDAgUiAvRmlsdGVyIC9GbGF0 1095 | ZURlY29kZSA+PgpzdHJlYW0KeAE9j7EKwjAURfd+xRmT 1096 | IbYvRFtXxcWt8MBBHDToVrHG/8dQTXjL4dx7hzczMtPl 1097 | GwYk8L5z4km7T0JMWaeYc1kaTgiBnjixU8T/pcdlHRqd 1098 | aFUll/XBGfOxdCuPuVrcAq8CUuBWoJrtzzSmL1HthGLW 1099 | BVydbSwX9MhB8z/jF29WKhUKZW5kc3RyZWFtCmVuZG9i 1100 | ago1IDAgb2JqCjEzMQplbmRvYmoKMiAwIG9iago8PCAv 1101 | VHlwZSAvUGFnZSAvUGFyZW50IDMgMCBSIC9SZXNvdXJj 1102 | ZXMgNiAwIFIgL0NvbnRlbnRzIDQgMCBSIC9NZWRpYUJv 1103 | eCBbMCAwIDg4IDE0XQo+PgplbmRvYmoKNiAwIG9iago8 1104 | PCAvUHJvY1NldCBbIC9QREYgL1RleHQgXSAvQ29sb3JT 1105 | cGFjZSA8PCAvQ3MxIDcgMCBSID4+IC9Gb250IDw8IC9U 1106 | VDEgOCAwIFIKPj4gPj4KZW5kb2JqCjkgMCBvYmoKPDwg 1107 | L0xlbmd0aCAxMCAwIFIgL04gMSAvQWx0ZXJuYXRlIC9E 1108 | ZXZpY2VHcmF5IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+ 1109 | CnN0cmVhbQp4AYVVXWgcVRQ+uzM7eYlDEW1LK3XwryGk 1110 | YVKtJha12026u03YrpuNNlWq09nZ7nQnM+Od2bQJfQqC 1111 | b1oQxFdFfBItiNBqxOTFvrRUqIkUiyAotFhBEPogCn5n 1112 | drI7G5HMcGe+Ofc7557z3XsYor5lw/edtEY054YiX8nO 1113 | Hp89ofV9R2lSqZ9wGWbgZ8vlKcau51r87r3urVOKLTf2 1114 | cazeuS2/MjUrMMFawfBqgTlHlNKJlGHTFyFR3+uwj54N 1115 | fcbvAz/QrFZywJ8Aq7EvID2Yt1xL2KaWF8aCVhZe3XaS 1116 | uW41zzG2vOacFufK1x6M/qA5PYn3IHI+VzPGGT8F/KFp 1117 | TEwDDwGv++HhSpuTTreaM9m2PT1UF0dmYvvxRqvAeJgo 1118 | vbTYqL4MvA34onuqdCzmr5hB7gTwY7DfbVhF3g+NSNpm 1119 | h8UqMHwlXXgV5oMjnaxZ4xPAzwIvNb1JzmEn8HIwP812 1120 | 5n+/2MiVgLGWnD5jHC0Dbwe+33LyzEccecAPyxxzFHjK 1121 | dUq8LuqV37SCqMYB4E/DRrUQ89dDUWXfR2D/q24fKQJD 1122 | h8xDDVFgO/LJFHwnOk9PAy+JVoVrfwL4kiEm8sCImfnJ 1123 | cmdYQ2BFoZdSBlnk0Sk8TXLpH9QekE3zEfJJYK6Ob4fy 1124 | YLgYAsMB6zTQrxRinq3sH1ATNvZlRoBnGUPE/hrV8NX2 1125 | szHLiCPejnzMTdwc4ri0SAZ47ZXvxDxP3iHr8pMYB+Up 1126 | +Tl5VB4jTX5BPiQ/L4/DOiYfjHwEfBcQtVsBr3gHUduR 1127 | 3qBWTz6ryDmEj0M/g+NFGQbI4G9EaEbMhBoXdrUGfP+9 1128 | t5fEa7Z5/Z0/Eupwbc24zq4+CV86llQ70r+2We3ML5nb 1129 | mTU8b2ZuJarRMj9mbuG+2VOXF69moz4bmW8oy9rb2FWv 1130 | h72xA5tZWVTuRHsyh2pZfd5RVp+VbAGHeNZhdWlfMuKV 1131 | 88s7O7wF0tbkS6/e6L9y/n81YX1YZ4sSqtTdC7t8/+TH 1132 | rKb1VuleiZaG9Iv6Xf0j/Qf9d31N/wDoN+ld6Qvpa+my 1133 | 9KV0lTRpRVqVvpG+lT6TvsLX57CuSpeRW/LUtU9Z5/Qg 1134 | 0/Y5NOMTxvXwKQ6IFWA218/WDaXOYK6bKZ/tzSuwzt0T 1135 | 3VlLPazuVh9Vx9WH1cfVKXVQPaAeUneo+zFG1IK6FzO7 1136 | OypxT7HWNt5lvDf6zqbZSKv2jnBWDagnkKWBu5sX96jd 1137 | iYY4qfugM0frcniNdnfbiKLF3euhYw2aQcU2nY20C/Dt 1138 | 4Bu7+R9v7klkl3oFJ8uW98gjcjHuwax8AF042dOPo9yl 1139 | yoQyrmRJUwaVMWVEOco4qpU7VFP2YnYMz4lk9oie4PQo 1140 | gr9PaJ3Df4so5/kLwj7dCLX9uv6MlsVv0tKKrjk8pBmO 1141 | o0VTgSaswBLzVm2Y+B/MfkR/vhj9W1Pbr5otMd+2USp1 1142 | jehf+rqHewplbmRzdHJlYW0KZW5kb2JqCjEwIDAgb2Jq 1143 | CjEwODgKZW5kb2JqCjcgMCBvYmoKWyAvSUNDQmFzZWQg 1144 | OSAwIFIgXQplbmRvYmoKMyAwIG9iago8PCAvVHlwZSAv 1145 | UGFnZXMgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0gL0Nv 1146 | dW50IDEgL0tpZHMgWyAyIDAgUiBdID4+CmVuZG9iagox 1147 | MSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMg 1148 | MyAwIFIgPj4KZW5kb2JqCjggMCBvYmoKPDwgL1R5cGUg 1149 | L0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNlRm9u 1150 | dCAvVkFQWkxZK0hlbHZldGljYSAvRm9udERlc2NyaXB0 1151 | b3IKMTIgMCBSIC9FbmNvZGluZyAvTWFjUm9tYW5FbmNv 1152 | ZGluZyAvRmlyc3RDaGFyIDQ1IC9MYXN0Q2hhciAxMTYg 1153 | L1dpZHRocyBbIDMzMwowIDAgMCA1NTYgMCAwIDU1NiA1 1154 | NTYgNTU2IDU1NiAwIDU1NiAwIDAgMCAwIDAgMCAwIDAg 1155 | MCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAw 1156 | IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA1NTYg 1157 | NTU2IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKNTU2 1158 | IDAgMCAwIDI3OCBdID4+CmVuZG9iagoxMiAwIG9iago8 1159 | PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0ZvbnROYW1l 1160 | IC9WQVBaTFkrSGVsdmV0aWNhIC9GbGFncyAzMiAvRm9u 1161 | dEJCb3ggWy05NTEgLTQ4MSAxNDQ1IDExMjJdCi9JdGFs 1162 | aWNBbmdsZSAwIC9Bc2NlbnQgNzcwIC9EZXNjZW50IC0y 1163 | MzAgL0NhcEhlaWdodCA2ODQgL1N0ZW1WIDAgL1hIZWln 1164 | aHQKNTEzIC9NYXhXaWR0aCAxNTAwIC9Gb250RmlsZTIg 1165 | MTMgMCBSID4+CmVuZG9iagoxMyAwIG9iago8PCAvTGVu 1166 | Z3RoIDE0IDAgUiAvTGVuZ3RoMSA3ODIwIC9GaWx0ZXIg 1167 | L0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ab1ZeVhUR7Y/ 1168 | Vffe3oCmF6AXaLqbphf2TZAWIi12I6gYFDW0EQUURSOR 1169 | zyCJJjqYaKK4vBgjOpgxyyTGJcYLEm31aYzRMXnZ4ySZ 1170 | SUxm8kIyzpth8mZGfVmk+517G4nwJfn8wy+3OFV16tRy 1171 | 6nfOPX2raF22vBGioB0YqJpV37IAxMe0E4vL85rrW8K8 1172 | pg/LvfPaWi1hnnMBMEsWtCxsDvOyxwEUpoVLVgyO1+4F 1173 | kD/a1Fg/PyyHa1gWNGFDmCejsExuam69L8xrerHMXrJ0 1174 | 3qBcuwl5Y3P9fYPrw0XkLXfXNzeG+5tasUxuWXqPUOJj 1175 | KsSsuGVZ42B/UoP6vQMEWyPhMZDDXSAFCipMtQDSSwoT 1176 | sCgV5Phkv/3Jy3Oji6+AWibycyv/QyzfOnb86DeN15wR 1177 | W2XfYoP8en+hlKQEU3BygvL+iK1DEnEcZpEBqE4LQAVS 1178 | CVI+UlraOD20kz3wKNJTSAwsIhthBdIGpF8jsUO1fcgd 1179 | Ixt7WJnnOFkBRjLRE8Gap8cYzHpFhPn9AJH07jb/Uf/F 1180 | CWJA631ODD1RIB+nIE+RJ2E+mMlzYCcroRxcpOtwyhJz 1181 | HYr2QQtSOxIj5oTs60nMNZ8i6WBnCY5xQCJLjpj/kpNh 1182 | /jInQEmP+YwzwGLxSiJynmjzadNu88umheZTSAfCov0p 1183 | 2OOIeZ9piXlbYoB09ZgfMwUIjtkaLpabcOgRc3NKp3l+ 1184 | jiif3BmgB3rMbpTP9ESYCwqt5nxTnznLGZAR5DNMk82p 1185 | OW+Zk3EgdrPgpHaP2pxg2mYeg6JEk885BukE2U92QSrZ 1186 | 1WOfaD6OVdzu4YqUws4Auf9wuSvHHiArPQXlrs6Ucqc9 1187 | ZbLZnlLmdGJ95mvStdI7peOkudI0qUvqkFql8dIYmUam 1188 | killkTKFTCaTBsgLPSVmyQlyAEoQlgOHZRIZFyAvYiN7 1189 | ghwUGw8elbEyKgNZTCD0Z3ReAjEBcqBXJdSwckQi1iQB 1190 | cvBwuOmgx8wKNVYUqKhQxwxzoERGYSLwZHNAAuvi2kr0 1191 | JZqxaneZ96eyOlFyPU/76UdPTHznpOoafr/Jz+cKlZDJ 1192 | f727/nrlJ8vW5ShqLE1LmzRtxeG2lsULfI02X53N14hU 1193 | x29sa9Lz7Q0WS/fiFkFg4RlHXcO8JqGsb+RbbI1efrHN 1194 | a+luE8eNEC8QxG02bzcs8E2v6V7gafT2tHnafLZ6r/9w 1195 | Q+my2mFrbRhaa1npj6xVKky2TFirQRw3Yq1aQdwgrFUr 1196 | rFUrrNXgaRDXEjbvW1Rdek8reqfFt2iShXdV8xVTZ9Xw 1197 | lnq/N0D2YKN3OXCnQcWdBBfXDkY2C8wAoT8ifSyUwRmh 1198 | r7jzoAo2h/7JFKFRjwlEgyXFcBo2wy44BBLYi3UXzIGd 1199 | 8DpZjO/2bOiFD0kiZGLsZSEAk+FNEgq9BwvgWezfCmdg 1200 | O3Rj9HJBM8SidAuxh1Yi78F6A6wNPQPJUAgPw0lw46xb 1201 | oD+0L3QYpdNgBuyHAzj+DWKj3aw29GKoD2QwFedci5L3 1202 | QpNDh0AD6VAKVdi6Fk4RO/NxqAn0UITaPQFPwtPwCvyd 1203 | PEh6Q02httC7oc/RVfWQANWYVpFe8jlziH049ETof0JB 1204 | RMIFqbhqHWyD3+L8hzCdxtDqI3eRVrKNbKce+iDtZddx 1205 | uuAA4pACEzCVw1JYjwgcg7PwL/iWfE31jIppZc6F8kP/ 1206 | hgiYhLsUdtIIbZgewbQF93SCSEg2GU+qyCryONlOLtBU 1207 | OoPW0HvpffQrZgozm1nBXGDvYXu4TdxOSUTwSuhE6Hzo 1208 | A9CBCe6EZbAad3cG3oXL8B1hcK4EYidFpJTMwdROdtFj 1209 | 5GlyjFaR0+Rdup/8iXxBvibfU45G0liaRlvpNnqAnqFv 1210 | M4uY7cyvmT8xV9ixHOWe5r6U2KWfBBuCG4Jvh4pCn4e+ 1211 | wRArAytaphSmwFyox922wCj4Fe7iIKZDaLWzcA5eF9MX 1212 | JAH64RtEAYiGGEkuqcQ0hdxOFpBFZDc5jumUqMtVioag 1213 | cqqmOppAq2kDbabt9APazsQzqcxEZhZzCNNrzIfM98z3 1214 | LMdq2Vh2AlsBm9hmtgvTHnYv28O+w7m5sdwUbibXzm3g 1215 | NjHzuPe4DyWrJVskPZKvJf+LYXGydKl0E1rndfTZV9CX 1216 | f3hYkoza58LdMI94SQN0ojWeJvXQgd41n6xHvFrAFapl 1217 | VjMTaDZ6wym4H721C1bBBmY2PB36A7MfPkJPWYJTtsPz 1218 | bCmYuB1onQchG71oMHlSUlNcToc92ZZktWDIT4g3GvS6 1219 | uNgYrUatioqMUMhlUgnHMpRAus9WVmfhHXU867CVl2cI 1220 | vK0eG+pvaKjDV9nClw3vw1uEcfUoGtbTgz0XjOjpCff0 1221 | DPUkKksxFGekW3w2C/+W12YJkFlTa7C+2WvzW/h+sV4p 1222 | 1h8V61FYt1pxgMWnb/JaeFJn8fFlbU0dvjpvRjo55kE4 1223 | FBnpQuDwQIQwMQ/j61dhgIXxQg8fb7R5fbzBhnWUMXZf 1224 | /Xy+amqNzxtvtfqxDZum1eAaGemLeNQTNkbOt83fGPBA 1225 | Q51Qq59dwzP1fp7WCXOp03idzcvrVn6p/4G9XvNtukHI 1226 | U3tZfWNHGe+p24jgCmydwNVvQm5StQWnpev8NTxZN6iE 1227 | oONi1FRQN/ybYK9bbOHltlJbU8fiOgQXptX0GD1GMfjy 1228 | UFXTY/AYRCYj/Zh+dZEVd38sY1zGOKEssupXh8u/PBRu 1229 | f/+0UOpXn/0zlpOmDQFABARsFagnb5knLmJDZQuFrLEQ 1230 | OuYVIk74+AlucxHqM56n6DOMnefsFfV8e/V1NZq8YeXq 1231 | Fnt75Aaj+CNU6sf+dR2qMWgp7K+yWTqu4K91na3/78Nb 1232 | 6gdbJHbVFRCEgqGHfIUn9dfrbcKPpR133aS3NQn2bRNt 1233 | irxN77uhAXkBGkFnPgZ/wKtqrLzFjw34NZk+KQDyqppu 1234 | Qrb4AyS0LgBe0zH8RmXmzkFxuuBqi7y4PjIZ6diQasVa 1235 | ZrqlDFcuE3zF0mHpqJjfYSmzNKEzsXaxREFjhz8LEayu 1236 | QZxgOq7o8ccPVRv9/jE4T5YwDw7B7h1+nGHx4AxYik1Z 1237 | A9gpOx1/TBlHVc3UGr7dG897vH60Arrv6aoa/jR6rt+P 1238 | vXKGNEWNVy3SD+qcizrnpKI8LzwLfru04xT+jg5hzuoa 1239 | m5U/3dER3yG8b2E+QGBkg2ewIQBCFwHyAGmvwrFY2Kzx 1240 | og2sNiuq5RcwHYUufd2j8Jv95xEuGNIbR45GbQtEhAtv 1241 | EcLum0F4zE0hXDSk6TCEi1HnIgHh2345hMcOQ7jk5xH2 1242 | DOmNSo5DbT0iwqW3COHxN4Ow96YQ9g1pOgzhMtTZJyA8 1243 | 4ZdDuHwYwhU/j/DEIb1RyUmo7UQR4cm3COHKm0F4yk0h 1244 | fPuQpsMQrkKdbxcQnvrLITxtGMLVP4/w9CG9UckZqO10 1245 | EeGZtwjhO24G4ZqbQtg/pOkwhGehzn4B4TuHEPbE83Bj 1246 | HG4fEXbhlgfm2TdAjl9KnAZK6X6Ywd4DZ5FGIZUiVSJN 1247 | QqpAmobUJhB149e/cMzGgzY+kXgC6cIyA08g4RY8f4sS 1248 | Bk9hHErxekjkb10mw1/ln34Ug6IIsSyA6bASXiOzyb9o 1249 | MX2feYKVsPexr6GM4lkC2HfxDMqghuPD90uyrACwSDJV 1250 | AOBdJIHHOnMR61hKsWSwlF+E4+K+ZqYdx5k4mJmWnZOn 1251 | tqqdSKXslsC1/+ZOfjc+wFZ+j/cViMwM8hmdRHfgWhaP 1252 | ArIYYuTAwOItSOlh6/FyvDqY0qf6CrIq+3OytdZY6wxy 1253 | NaigO4RzL8GTDdAPuMfwBGTrlpEAyfNEsqw0kpV2cqCY 1254 | IFe1ndWf/WDADSUll9/C4fljyeg8tU199tUux5bTzNUO 1255 | rX/Pd3czV8U9j8I9Z3FPoM5RMNuTJKcKWRSh9JRGIpFS 1256 | CeGkMjzHSRV0eQT3NRMpZZkA0b1EOqNkLygCpOYwFz1B 1257 | Kaz3+yuXiwf6hBWLB4rVbjdRa9z4534kM41dpToXnZNN 1258 | 1HKituaTPHVerE1Nnwvmk7cHNtFHd164gEfADQP3Bjky 1259 | h2e2XJv7m+AzqBruszR0kU3A+wALnPCklWvWm6k7skx7 1260 | h3ahlh0ji4ySQqQiWqlcrtFqNcpoi0YrBa1OoctHxZI8 1261 | xqhfKZUmzZhols23nDdFqaWFxqVQaEmaYBX17b/SfxZK 1262 | +vtLBjTurL7L/aisoLM7rDOqDIMNOdn68Ss8Lr2ZyKmD 1263 | ScTDOF7lWbgEqYvI9ZgRM+sCSTxmMoPCRfAWMo2kpamK 1264 | VcVpaWvWQG2tNk4Xl5dbkD/KYUuSSJ2CNZmC0QV5uWxs 1265 | DLUmJTsHNKs805/qOtpeuy7riWZ6aeDJ23IzqhadI5rv 1266 | g/2Hgv9WkeauosQ3H+h8ttwjZ5gXg8scWmvw1TeC/3Xu 1267 | TdGGlaFPWBu3G+LBCfs87nuNRCezy5yGGsPD8AhZL5dO 1268 | kCmsTmu+UhnDnJfmx3PO/JgoJoWuSSxUL9UpaLEiOUeX 1269 | MsElAjPgfmDStPtWZulVV/ov9yNECBJCJACUk41IjLI7 1270 | EizRcSDhHJboRBdxxCa7IEGLNQkwLsIyZpXVRexxTheY 1271 | NJixBEESLoGIgAg+a/AhtXhNHBdrczgRFPoDHLYkUKtG 1272 | a6yaQbhiY+LymAkne1S2cWt39CjGzpm5uJdEBv/2evDi 1273 | uFVk8prNq/e0HnpyM7f727UzsmcF/xq8dmeG66u+V4MX 1274 | SA4e7SOOk/nfffryg3ef79q1PvzuTBL9vR2iodpTwEUY 1275 | aGHEmEh31MSoGXQm20CPShUPRPVGnYtiqJxEKcdANCuP 1276 | pFF4bb1UKSuUv6BUT1CJMF3uV30p+Au6PHo8ug2pzcmu 1277 | JbESKpVgsmm0BaOt+WyW78uaOzJMmee9lzbsuHaJa//N 1278 | +GDv6RNd8y6SLtL5j4MvCXGnIvQHVs11ifY74Mk0cGmc 1279 | K65cUsM1cRsM6407jfIymdTqdOYrFHprvopj8+PP66Ok 1280 | tFiamIO3ojM8EVGQEr8muTDquhHRcqorA+5VYUuKfj7c 1281 | iGaHwRihJYzGTh1J0WhBixotyBjQvR0RyNqUaESzFjNi 1282 | RNe2R6IlBeOJlrxuQxL2bK2SoBHzR2nyLNq4WJUUndqR 1283 | DzdYkKhkd432rTniKO5e8M4//3GJuO8tvf2h4Pn3P6a5 1284 | 3U/ev3bX+u1k1nZ34kekYm4loW+8SlzBr3b9NfjtG8EX 1285 | L+4hjs387l3dj296Dv/lANMwJgg3LtF4l1YMn3oKU7OJ 1286 | QhURH5ngzCtXLZIvVkndMk2knInPlSbLTapIU1EazUwp 1287 | OlpEi3JT7RqVlJMlOJN0CQHS4bHpTGap05QZQU35EcXS 1288 | 4uKEGGlK6t5k49j4lISJ0c5Cw21j/5PswIumY6QThKB8 1289 | uRKhnaK6Wtk3cBbfCrQ+vh/iG6LW6Ny16BGZ/Zn9YvTT 1290 | hd8XV8Ho2CQgBjspiLaCPjHeCnGWGCuxJsFoagWjSWcl 1291 | sVbMxMgRfkfwDYFaUpuMcWN0wW1ESaIxBktiCYYNMYwI 1292 | DjaW5OXilY0a35BcXEKwgdPhFApH/qiC0VqiXDZlrr/T 1293 | 2pTb3JBTTXrHxkY+tHJzkVWxl/u/355sW66zRyaqU9Md 1294 | talx8tFvP7D95PEdHe/MSq/YszU2QaKMSshaSJbI0vUZ 1295 | s6snp1b/bld5+c6BHQlJDLMuUlJq85Qvfmn99me1pE/w 1296 | 37bQZ6ydOwNqSIQWT+Ye6fMJHyUwSbLoRMoB6EycVK1I 1297 | NEVExDhlRosxU5VJUkBtMFsesZ6sFUEtrhzo6xNQFeMN 1298 | Aqp2q8Po6TVxEkWcJMZBNArMYqU6B9HKEx0IFrqiAJM2 1299 | Ty1AoVHHUBGBWFvykOth4G07VPRs3WvfXv145fRc9x66 1300 | YOvWzfcfc0w4w50Z+Fvl1GB/8HIwyBfZKjesunRq32dH 1301 | 3tsxp1uMqW3BGawd/UwJSdDqSd8ne15HXTJLglopMcVK 1302 | oyVKU0JEkpI69cZkBe7ImpIUbbAl/+iOcD8l/WoMEWL8 1303 | TIiLB87oYB0QTx2Ei8OMGJQOYHQSB25JfMGEfQm7EKIj 1304 | 2j0G90HyYsUfDbygk0rEjapt9HfP28uOn/DZMQ9mHirw 1305 | 3Hn/keDR1q4V07KLeldceL99dveJ+V0P3LGH6d5S4SrG 1306 | 8DgQfKZzbn5ixcCnwu+rLvQ1lXOz8OZ52ktRmYrTSvyW 1307 | KPHY2Ti3jpEoFWqjTmfEX/8UiFXGRjNmhjLX4gwG4zXr 1308 | wlXhd2Gg1n02C8Ofaoqv0YtfKxgLKweK+1UDffjZEf6h 1309 | F3S/7p+OfLUtP2/vkQMHHLE5UYkx5vHO1bO2buVmBT/Y 1310 | NuAr1EYQukUuW7OQntsm2gAzvP1vxDvqH3sisVEFMfj1 1311 | qQcDGPH23As+vD+/Q+xM8AY+/P0pwV4wc1zVrMn+tPLG 1312 | JW2NrYvm1WOfsFToXIjkRZqONB9J+J/nWqTHkZ5F6kU6 1313 | i/R7pL7Q4IN1GKoT/N4dzueM4EeN4PNH8AUj+NEjePcI 1314 | XtjBjes3jOBbRvCtAv//Mlgo6AplbmRzdHJlYW0KZW5k 1315 | b2JqCjE0IDAgb2JqCjQ4NDcKZW5kb2JqCjE1IDAgb2Jq 1316 | CihkaWFncmFtcy5ncmFmZmxlKQplbmRvYmoKMTYgMCBv 1317 | YmoKKE1hYyBPUyBYIDEwLjkgUXVhcnR6IFBERkNvbnRl 1318 | eHQpCmVuZG9iagoxNyAwIG9iagooTG9yaW4gSG9jaHN0 1319 | ZWluKQplbmRvYmoKMTggMCBvYmoKKE9tbmlHcmFmZmxl 1320 | IFByb2Zlc3Npb25hbCA1LjQuNCkKZW5kb2JqCjE5IDAg 1321 | b2JqCihEOjIwMTMxMTA2MDQxNDMxWjAwJzAwJykKZW5k 1322 | b2JqCjEgMCBvYmoKPDwgL1RpdGxlIDE1IDAgUiAvQXV0 1323 | aG9yIDE3IDAgUiAvUHJvZHVjZXIgMTYgMCBSIC9DcmVh 1324 | dG9yIDE4IDAgUiAvQ3JlYXRpb25EYXRlCjE5IDAgUiAv 1325 | TW9kRGF0ZSAxOSAwIFIgPj4KZW5kb2JqCnhyZWYKMCAy 1326 | MAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDc1NTUg 1327 | MDAwMDAgbiAKMDAwMDAwMDI0NiAwMDAwMCBuIAowMDAw 1328 | MDAxNjkyIDAwMDAwIG4gCjAwMDAwMDAwMjIgMDAwMDAg 1329 | biAKMDAwMDAwMDIyNyAwMDAwMCBuIAowMDAwMDAwMzQ4 1330 | IDAwMDAwIG4gCjAwMDAwMDE2NTcgMDAwMDAgbiAKMDAw 1331 | MDAwMTgyNSAwMDAwMCBuIAowMDAwMDAwNDQ1IDAwMDAw 1332 | IG4gCjAwMDAwMDE2MzYgMDAwMDAgbiAKMDAwMDAwMTc3 1333 | NSAwMDAwMCBuIAowMDAwMDAyMTYyIDAwMDAwIG4gCjAw 1334 | MDAwMDIzODcgMDAwMDAgbiAKMDAwMDAwNzMyNCAwMDAw 1335 | MCBuIAowMDAwMDA3MzQ1IDAwMDAwIG4gCjAwMDAwMDcz 1336 | ODAgMDAwMDAgbiAKMDAwMDAwNzQzMCAwMDAwMCBuIAow 1337 | MDAwMDA3NDY0IDAwMDAwIG4gCjAwMDAwMDc1MTMgMDAw 1338 | MDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAyMCAvUm9vdCAx 1339 | MSAwIFIgL0luZm8gMSAwIFIgL0lEIFsgPDA5NTEzM2Mw 1340 | ZDhkMzYyZDZjYThiNzEzMmNkNjI2OTI1Pgo8MDk1MTMz 1341 | YzBkOGQzNjJkNmNhOGI3MTMyY2Q2MjY5MjU+IF0gPj4K 1342 | c3RhcnR4cmVmCjc2NzUKJSVFT0YKAQAAABQAAABQYXN0 1343 | ZWQgR3JhcGhpYyAxLnBkZgEAAAAUAAAAUGFzdGVkIEdy 1344 | YXBoaWMgMS5wZGYBAAAAHgAAAAEAAAACAAAALi4QAAAA 1345 | AAAAALYBAAACAAAAAQAAAIaGhoaG 1346 | 1347 | 1348 | 1349 | 1350 | Bounds 1351 | {{84, 326}, {239, 176}} 1352 | Class 1353 | ShapedGraphic 1354 | HFlip 1355 | YES 1356 | ID 1357 | 32 1358 | Shape 1359 | RoundRect 1360 | Style 1361 | 1362 | fill 1363 | 1364 | Draws 1365 | NO 1366 | 1367 | stroke 1368 | 1369 | Pattern 1370 | 2 1371 | 1372 | 1373 | VFlip 1374 | YES 1375 | 1376 | 1377 | Bounds 1378 | {{385, 388.75}, {141, 42}} 1379 | Class 1380 | ShapedGraphic 1381 | FitText 1382 | YES 1383 | Flow 1384 | Resize 1385 | ID 1386 | 27 1387 | Shape 1388 | Rectangle 1389 | Style 1390 | 1391 | fill 1392 | 1393 | Draws 1394 | NO 1395 | 1396 | shadow 1397 | 1398 | Draws 1399 | NO 1400 | 1401 | stroke 1402 | 1403 | Draws 1404 | NO 1405 | 1406 | 1407 | Text 1408 | 1409 | Pad 1410 | 0 1411 | Text 1412 | {\rtf1\ansi\ansicpg1252\cocoartf1265 1413 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 1414 | {\colortbl;\red255\green255\blue255;} 1415 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 1416 | 1417 | \f0\fs24 \cf0 Namespace: \ 1418 | qdhcp-4b523b2a-5921-\ 1419 | 4e8b-9e64-7b668c4aab85} 1420 | VerticalPad 1421 | 0 1422 | 1423 | Wrap 1424 | NO 1425 | 1426 | 1427 | Bounds 1428 | {{16, 312}, {111, 14}} 1429 | Class 1430 | ShapedGraphic 1431 | FitText 1432 | YES 1433 | Flow 1434 | Resize 1435 | ID 1436 | 25 1437 | Shape 1438 | Rectangle 1439 | Style 1440 | 1441 | fill 1442 | 1443 | Draws 1444 | NO 1445 | 1446 | shadow 1447 | 1448 | Draws 1449 | NO 1450 | 1451 | stroke 1452 | 1453 | Draws 1454 | NO 1455 | 1456 | 1457 | Text 1458 | 1459 | Pad 1460 | 0 1461 | Text 1462 | {\rtf1\ansi\ansicpg1252\cocoartf1265 1463 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 1464 | {\colortbl;\red255\green255\blue255;} 1465 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 1466 | 1467 | \f0\fs24 \cf0 Open vSwitch bridge} 1468 | VerticalPad 1469 | 0 1470 | 1471 | Wrap 1472 | NO 1473 | 1474 | 1475 | Bounds 1476 | {{209, 259.5}, {47, 14}} 1477 | Class 1478 | ShapedGraphic 1479 | FitText 1480 | YES 1481 | Flow 1482 | Resize 1483 | ID 1484 | 23 1485 | Shape 1486 | Rectangle 1487 | Style 1488 | 1489 | fill 1490 | 1491 | Draws 1492 | NO 1493 | 1494 | shadow 1495 | 1496 | Draws 1497 | NO 1498 | 1499 | stroke 1500 | 1501 | Draws 1502 | NO 1503 | 1504 | 1505 | Text 1506 | 1507 | Pad 1508 | 0 1509 | Text 1510 | {\rtf1\ansi\ansicpg1252\cocoartf1265 1511 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 1512 | {\colortbl;\red255\green255\blue255;} 1513 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 1514 | 1515 | \f0\fs24 \cf0 veth pair} 1516 | VerticalPad 1517 | 0 1518 | 1519 | Wrap 1520 | NO 1521 | 1522 | 1523 | Class 1524 | LineGraphic 1525 | ID 1526 | 22 1527 | Points 1528 | 1529 | {285, 243} 1530 | {285, 290} 1531 | 1532 | Style 1533 | 1534 | stroke 1535 | 1536 | HeadArrow 1537 | 0 1538 | Legacy 1539 | 1540 | TailArrow 1541 | 0 1542 | Width 1543 | 3 1544 | 1545 | 1546 | 1547 | 1548 | Bounds 1549 | {{194, 185.125}, {66, 14}} 1550 | Class 1551 | ShapedGraphic 1552 | FitText 1553 | YES 1554 | Flow 1555 | Resize 1556 | ID 1557 | 20 1558 | Shape 1559 | Rectangle 1560 | Style 1561 | 1562 | fill 1563 | 1564 | Draws 1565 | NO 1566 | 1567 | shadow 1568 | 1569 | Draws 1570 | NO 1571 | 1572 | stroke 1573 | 1574 | Draws 1575 | NO 1576 | 1577 | 1578 | Text 1579 | 1580 | Pad 1581 | 0 1582 | Text 1583 | {\rtf1\ansi\ansicpg1252\cocoartf1265 1584 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 1585 | {\colortbl;\red255\green255\blue255;} 1586 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 1587 | 1588 | \f0\fs24 \cf0 Linux bridge} 1589 | VerticalPad 1590 | 0 1591 | 1592 | Wrap 1593 | NO 1594 | 1595 | 1596 | Bounds 1597 | {{184, 130}, {86, 14}} 1598 | Class 1599 | ShapedGraphic 1600 | FitText 1601 | YES 1602 | Flow 1603 | Resize 1604 | ID 1605 | 19 1606 | Shape 1607 | Rectangle 1608 | Style 1609 | 1610 | fill 1611 | 1612 | Draws 1613 | NO 1614 | 1615 | shadow 1616 | 1617 | Draws 1618 | NO 1619 | 1620 | stroke 1621 | 1622 | Draws 1623 | NO 1624 | 1625 | 1626 | Text 1627 | 1628 | Pad 1629 | 0 1630 | Text 1631 | {\rtf1\ansi\ansicpg1252\cocoartf1265 1632 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 1633 | {\colortbl;\red255\green255\blue255;} 1634 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 1635 | 1636 | \f0\fs24 \cf0 Virtual NIC (tap)} 1637 | VerticalPad 1638 | 0 1639 | 1640 | Wrap 1641 | NO 1642 | 1643 | 1644 | Class 1645 | LineGraphic 1646 | Head 1647 | 1648 | ID 1649 | 17 1650 | 1651 | ID 1652 | 18 1653 | Points 1654 | 1655 | {359.00000902587982, 259.75} 1656 | {359.00000902587982, 275.5} 1657 | 1658 | Style 1659 | 1660 | stroke 1661 | 1662 | HeadArrow 1663 | 0 1664 | Legacy 1665 | 1666 | TailArrow 1667 | 0 1668 | 1669 | 1670 | Tail 1671 | 1672 | ID 1673 | 13 1674 | 1675 | 1676 | 1677 | Bounds 1678 | {{298.5, 276}, {121, 24}} 1679 | Class 1680 | ShapedGraphic 1681 | ID 1682 | 17 1683 | Shape 1684 | Rectangle 1685 | Text 1686 | 1687 | Text 1688 | {\rtf1\ansi\ansicpg1252\cocoartf1265 1689 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 1690 | {\colortbl;\red255\green255\blue255;} 1691 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 1692 | 1693 | \f0\fs24 \cf0 qvob5e2060e-02} 1694 | 1695 | 1696 | 1697 | Class 1698 | LineGraphic 1699 | Head 1700 | 1701 | ID 1702 | 13 1703 | 1704 | ID 1705 | 16 1706 | Points 1707 | 1708 | {358.99998844294043, 206.5} 1709 | {358.99998844294043, 234.75} 1710 | 1711 | Style 1712 | 1713 | stroke 1714 | 1715 | HeadArrow 1716 | 0 1717 | Legacy 1718 | 1719 | TailArrow 1720 | 0 1721 | 1722 | 1723 | Tail 1724 | 1725 | ID 1726 | 10 1727 | 1728 | 1729 | 1730 | Bounds 1731 | {{298.5, 235.25}, {121, 24}} 1732 | Class 1733 | ShapedGraphic 1734 | ID 1735 | 13 1736 | Shape 1737 | Rectangle 1738 | Text 1739 | 1740 | Text 1741 | {\rtf1\ansi\ansicpg1252\cocoartf1265 1742 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 1743 | {\colortbl;\red255\green255\blue255;} 1744 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 1745 | 1746 | \f0\fs24 \cf0 qvbb5e2060e-02} 1747 | 1748 | 1749 | 1750 | Class 1751 | LineGraphic 1752 | Head 1753 | 1754 | ID 1755 | 6 1756 | 1757 | ID 1758 | 11 1759 | Points 1760 | 1761 | {358.99998874261695, 174.5} 1762 | {358.99998874261695, 149.5} 1763 | 1764 | Style 1765 | 1766 | stroke 1767 | 1768 | HeadArrow 1769 | 0 1770 | Legacy 1771 | 1772 | TailArrow 1773 | 0 1774 | 1775 | 1776 | Tail 1777 | 1778 | ID 1779 | 10 1780 | 1781 | 1782 | 1783 | Bounds 1784 | {{309.5, 175}, {99, 31}} 1785 | Class 1786 | ShapedGraphic 1787 | ID 1788 | 10 1789 | Shape 1790 | Rectangle 1791 | Style 1792 | 1793 | stroke 1794 | 1795 | CornerRadius 1796 | 5 1797 | 1798 | 1799 | Text 1800 | 1801 | Text 1802 | {\rtf1\ansi\ansicpg1252\cocoartf1265 1803 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 1804 | {\colortbl;\red255\green255\blue255;} 1805 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 1806 | 1807 | \f0\fs24 \cf0 qbrb5e2060e-02} 1808 | 1809 | 1810 | 1811 | Class 1812 | LineGraphic 1813 | Head 1814 | 1815 | ID 1816 | 5 1817 | 1818 | ID 1819 | 7 1820 | Points 1821 | 1822 | {359.00000672245096, 124.5} 1823 | {359.00000672245096, 101.5} 1824 | 1825 | Style 1826 | 1827 | stroke 1828 | 1829 | HeadArrow 1830 | 0 1831 | Legacy 1832 | 1833 | TailArrow 1834 | 0 1835 | 1836 | 1837 | Tail 1838 | 1839 | ID 1840 | 6 1841 | 1842 | 1843 | 1844 | Bounds 1845 | {{309.5, 125}, {99, 24}} 1846 | Class 1847 | ShapedGraphic 1848 | ID 1849 | 6 1850 | Shape 1851 | Rectangle 1852 | Text 1853 | 1854 | Text 1855 | {\rtf1\ansi\ansicpg1252\cocoartf1265 1856 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 1857 | {\colortbl;\red255\green255\blue255;} 1858 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 1859 | 1860 | \f0\fs24 \cf0 tapb5e2060e-02} 1861 | 1862 | 1863 | 1864 | Bounds 1865 | {{341, 77}, {36, 24}} 1866 | Class 1867 | ShapedGraphic 1868 | ID 1869 | 5 1870 | Shape 1871 | Rectangle 1872 | Text 1873 | 1874 | Text 1875 | {\rtf1\ansi\ansicpg1252\cocoartf1265 1876 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 1877 | {\colortbl;\red255\green255\blue255;} 1878 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 1879 | 1880 | \f0\fs24 \cf0 eth0} 1881 | 1882 | 1883 | 1884 | Bounds 1885 | {{282, 6}, {154, 95}} 1886 | Class 1887 | ShapedGraphic 1888 | ID 1889 | 3 1890 | Shape 1891 | Rectangle 1892 | Text 1893 | 1894 | Text 1895 | {\rtf1\ansi\ansicpg1252\cocoartf1265 1896 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 1897 | {\colortbl;\red255\green255\blue255;} 1898 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 1899 | 1900 | \f0\fs24 \cf0 cirros} 1901 | 1902 | 1903 | 1904 | Bounds 1905 | {{353.5, 312}, {204, 156}} 1906 | Class 1907 | ShapedGraphic 1908 | HFlip 1909 | YES 1910 | ID 1911 | 31 1912 | Shape 1913 | RoundRect 1914 | Style 1915 | 1916 | fill 1917 | 1918 | Draws 1919 | NO 1920 | 1921 | stroke 1922 | 1923 | Pattern 1924 | 2 1925 | 1926 | 1927 | VFlip 1928 | YES 1929 | 1930 | 1931 | Bounds 1932 | {{137, 300}, {386, 36}} 1933 | Class 1934 | ShapedGraphic 1935 | ID 1936 | 24 1937 | Shape 1938 | Rectangle 1939 | Style 1940 | 1941 | stroke 1942 | 1943 | CornerRadius 1944 | 5 1945 | 1946 | 1947 | Text 1948 | 1949 | Text 1950 | {\rtf1\ansi\ansicpg1252\cocoartf1265 1951 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 1952 | {\colortbl;\red255\green255\blue255;} 1953 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc 1954 | 1955 | \f0\fs24 \cf0 br-int} 1956 | 1957 | 1958 | 1959 | Bounds 1960 | {{67.5, 500.875}, {259, 47.125}} 1961 | Class 1962 | ShapedGraphic 1963 | ID 1964 | 33 1965 | Shape 1966 | Rectangle 1967 | Style 1968 | 1969 | stroke 1970 | 1971 | CornerRadius 1972 | 5 1973 | 1974 | 1975 | 1976 | 1977 | GridInfo 1978 | 1979 | GuidesLocked 1980 | NO 1981 | GuidesVisible 1982 | YES 1983 | HPages 1984 | 1 1985 | ImageCounter 1986 | 1 1987 | KeepToScale 1988 | 1989 | Layers 1990 | 1991 | 1992 | Lock 1993 | NO 1994 | Name 1995 | Layer 1 1996 | Print 1997 | YES 1998 | View 1999 | YES 2000 | 2001 | 2002 | LayoutInfo 2003 | 2004 | Animate 2005 | NO 2006 | circoMinDist 2007 | 18 2008 | circoSeparation 2009 | 0.0 2010 | layoutEngine 2011 | dot 2012 | neatoSeparation 2013 | 0.0 2014 | twopiSeparation 2015 | 0.0 2016 | 2017 | LinksVisible 2018 | NO 2019 | MagnetsVisible 2020 | NO 2021 | MasterSheets 2022 | 2023 | ModificationDate 2024 | 2013-11-06 06:45:43 +0000 2025 | Modifier 2026 | Lorin Hochstein 2027 | NotesVisible 2028 | NO 2029 | Orientation 2030 | 2 2031 | OriginVisible 2032 | NO 2033 | PageBreaks 2034 | YES 2035 | PrintInfo 2036 | 2037 | NSBottomMargin 2038 | 2039 | float 2040 | 41 2041 | 2042 | NSHorizonalPagination 2043 | 2044 | coded 2045 | BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG 2046 | 2047 | NSLeftMargin 2048 | 2049 | float 2050 | 18 2051 | 2052 | NSPaperSize 2053 | 2054 | size 2055 | {612, 792} 2056 | 2057 | NSPrintReverseOrientation 2058 | 2059 | int 2060 | 0 2061 | 2062 | NSRightMargin 2063 | 2064 | float 2065 | 18 2066 | 2067 | NSTopMargin 2068 | 2069 | float 2070 | 18 2071 | 2072 | 2073 | PrintOnePage 2074 | 2075 | ReadOnly 2076 | NO 2077 | RowAlign 2078 | 1 2079 | RowSpacing 2080 | 36 2081 | SheetTitle 2082 | Canvas 1 2083 | SmartAlignmentGuidesActive 2084 | YES 2085 | SmartDistanceGuidesActive 2086 | YES 2087 | UniqueID 2088 | 1 2089 | UseEntirePage 2090 | 2091 | VPages 2092 | 1 2093 | WindowInfo 2094 | 2095 | CurrentSheet 2096 | 0 2097 | ExpandedCanvases 2098 | 2099 | 2100 | name 2101 | Canvas 1 2102 | 2103 | 2104 | Frame 2105 | {{918, 246}, {1588, 969}} 2106 | ListView 2107 | 2108 | OutlineWidth 2109 | 142 2110 | RightSidebar 2111 | 2112 | ShowRuler 2113 | 2114 | Sidebar 2115 | 2116 | SidebarWidth 2117 | 120 2118 | VisibleRegion 2119 | {{-439, -48}, {1453, 830}} 2120 | Zoom 2121 | 1 2122 | ZoomValues 2123 | 2124 | 2125 | Canvas 1 2126 | 1 2127 | 1 2128 | 2129 | 2130 | 2131 | 2132 | 2133 | -------------------------------------------------------------------------------- /getting-started.md: -------------------------------------------------------------------------------- 1 | # Getting started 2 | 3 | ## Get your Rackspace credentials 4 | 5 | You should have a Rackspace username and password. You'll be using these to access the cloud. 6 | 7 | 1. Log in at 8 | 2. Write down the number that appears next to your login name in the top right-hand corner. In the example below, that's 12345. 9 | 10 | ![image](rackspace-screen.png) 11 | 12 | 3. Click on your login name on the top-right, then click on "Account Settings" 13 | 4. Generate an API key if it's not there yet, and then click "Show" 14 | ![image](rackspace-api.png) 15 | 5. Write down your API key. 16 | 17 | 18 | ### Install OpenStack command-line tools 19 | 20 | Install the OpenStack command-line tools on your local machine. It's best to install this within a Python virtualenv. 21 | 22 | $ virtualenv openstack 23 | $ source openstack/bin/activate 24 | $ pip install rackspace-novaclient python-swiftclient 25 | 26 | 27 | ### Create a valid openrc file for 28 | 29 | 30 | Download the linked [rax.openrc] file, and fill in your username, account number, and API key. For example, if your had: 31 | 32 | * username `jane.doe` 33 | * account number `12345` 34 | * API key `1c3cdf47937c40faa9f7a8ba5efa5560` 35 | 36 | Then edit the following lines 37 | 38 | ``` 39 | export OS_USERNAME=jane.doe 40 | export OS_TENANT_NAME=12345 41 | export OS_PASSWORD=1c3cdf47937c40faa9f7a8ba5efa5560 42 | export OS_PROJECT_ID=12345 43 | ```` 44 | 45 | And the entire rax.openrc file should now look like: 46 | 47 | 48 | ``` 49 | export OS_AUTH_URL=https://identity.api.rackspacecloud.com/v2.0/ 50 | export OS_AUTH_SYSTEM=rackspace 51 | export OS_REGION_NAME=IAD 52 | export OS_USERNAME=jane.doe 53 | export OS_TENANT_NAME=12345 54 | export OS_PASSWORD=1c3cdf47937c40faa9f7a8ba5efa5560 55 | export OS_PROJECT_ID=12345 56 | export OS_NO_CACHE=1 57 | 58 | export ST_AUTH=https://auth.api.rackspacecloud.com/v1.0 59 | export ST_USER=$OS_USERNAME 60 | export ST_KEY=$OS_PASSWORD 61 | ``` 62 | 63 | ### Confirm compute client is working 64 | 65 | Make sure the OpenStack Compute client (nova) is working by trying to list available images on Rackspace: 66 | 67 | $ source rax.openrc 68 | $ nova flavor-list 69 | 70 | The output should look something like this: 71 | 72 | +----+-------------------------+-----------+------+-----------+------+-------+-------------+-----------+ 73 | | ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public | 74 | +----+-------------------------+-----------+------+-----------+------+-------+-------------+-----------+ 75 | | 2 | 512MB Standard Instance | 512 | 20 | 0 | 512 | 1 | 80.0 | N/A | 76 | | 3 | 1GB Standard Instance | 1024 | 40 | 0 | 1024 | 1 | 120.0 | N/A | 77 | | 4 | 2GB Standard Instance | 2048 | 80 | 0 | 2048 | 2 | 240.0 | N/A | 78 | | 5 | 4GB Standard Instance | 4096 | 160 | 0 | 2048 | 2 | 400.0 | N/A | 79 | | 6 | 8GB Standard Instance | 8192 | 320 | 0 | 2048 | 4 | 600.0 | N/A | 80 | | 7 | 15GB Standard Instance | 15360 | 620 | 0 | 2048 | 6 | 800.0 | N/A | 81 | | 8 | 30GB Standard Instance | 30720 | 1200 | 0 | 2048 | 8 | 1200.0 | N/A | 82 | +----+-------------------------+-----------+------+-----------+------+-------+-------------+-----------+ 83 | 84 | ### Confirm object storage client is working 85 | 86 | Make sure the OpenStack Object Storage client (swift) is working by checking the status of your object storage account: 87 | 88 | $ source rax.openrc 89 | $ swift stat 90 | 91 | The output should look something like this: 92 | 93 | 94 | Account: MossoCloudFS_4911155b-32a5-317a-d0ef-6db8f4887013 95 | Containers: 0 96 | Objects: 0 97 | Bytes: 0 98 | Content-Type: text/plain; charset=utf-8 99 | X-Timestamp: 1383359439.45298 100 | X-Trans-Id: txf8f114e6ecac49db9c5e0-00527463cfiad3 101 | X-Put-Timestamp: 1383359439.45298 102 | 103 | Next exercise is [compute]. 104 | 105 | [rax.openrc]: https://github.com/lorin/openstack-hackspace/blob/master/rax.openrc 106 | [compute]: boot-instance.md -------------------------------------------------------------------------------- /launch-instance-net.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorin/openstack-hackspace/114023c031b3d72e348f98d267c5b266dde1fac2/launch-instance-net.png -------------------------------------------------------------------------------- /launch-instance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorin/openstack-hackspace/114023c031b3d72e348f98d267c5b266dde1fac2/launch-instance.png -------------------------------------------------------------------------------- /menu-associate-floating-ip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorin/openstack-hackspace/114023c031b3d72e348f98d267c5b266dde1fac2/menu-associate-floating-ip.png -------------------------------------------------------------------------------- /network-under-hood.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorin/openstack-hackspace/114023c031b3d72e348f98d267c5b266dde1fac2/network-under-hood.png -------------------------------------------------------------------------------- /object-storage.md: -------------------------------------------------------------------------------- 1 | # Object storage 2 | 3 | OpenStack Object Storage allows you to store files. Here we'll use Rackspace Cloud Files, which is built on top of OpenStack Object Storage. 4 | 5 | ## Upload a file 6 | 7 | Here we're going to upload a file into the "hackspace" container. We'll use an OpenStack logo as our file: 8 | 9 | ![image](http://www.openstack.org/assets/openstack-logo/openstack-cloud-software-vertical-small.png) 10 | 11 | 12 | Download the file [openstack-cloud-software-vertical-small.png] to your local machine: 13 | 14 | $ wget http://www.openstack.org/assets/openstack-logo/openstack-cloud-software-vertical-small.png 15 | 16 | Now, upload this file to object store into a new container called "hackspace": 17 | 18 | $ swift upload hackspace openstack-cloud-software-vertical-small.png 19 | 20 | The hackspace container should now appear: 21 | 22 | $ swift list 23 | 24 | Output should look like: 25 | 26 | hackspace 27 | 28 | The contents of the container should be the file: 29 | 30 | $ swift list hackspace 31 | 32 | Output should look like: 33 | 34 | openstack-cloud-software-vertical-small.png 35 | 36 | [openstack-cloud-software-vertical-small.png]: http://www.openstack.org/assets/openstack-logo/openstack-cloud-software-vertical-small.png 37 | 38 | ## Download a file 39 | 40 | Download the file from Openstack Object Storage to your local machine, giving it a different name (logo.png): 41 | 42 | $ swift download hackspace openstack-cloud-software-vertical-small.png --output logo.png 43 | 44 | 45 | Next exercise is [DevStack]. 46 | 47 | [DevStack]: devstack.md 48 | 49 | -------------------------------------------------------------------------------- /openstack-cloud-software-vertical-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorin/openstack-hackspace/114023c031b3d72e348f98d267c5b266dde1fac2/openstack-cloud-software-vertical-small.png -------------------------------------------------------------------------------- /rackspace-api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorin/openstack-hackspace/114023c031b3d72e348f98d267c5b266dde1fac2/rackspace-api.png -------------------------------------------------------------------------------- /rackspace-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorin/openstack-hackspace/114023c031b3d72e348f98d267c5b266dde1fac2/rackspace-screen.png -------------------------------------------------------------------------------- /rax.openrc: -------------------------------------------------------------------------------- 1 | export OS_VERSION=2.0 2 | export OS_AUTH_URL=https://identity.api.rackspacecloud.com/v2.0/ 3 | export OS_AUTH_SYSTEM=rackspace 4 | export OS_REGION_NAME=IAD 5 | export OS_USERNAME= 6 | export OS_TENANT_NAME= 7 | export OS_PASSWORD= 8 | export OS_PROJECT_ID= 9 | export OS_NO_CACHE=1 10 | 11 | export ST_AUTH=https://auth.api.rackspacecloud.com/v1.0 12 | export ST_USER=$OS_USERNAME 13 | export ST_KEY=$OS_PASSWORD 14 | -------------------------------------------------------------------------------- /temp-url.md: -------------------------------------------------------------------------------- 1 | # Make an object accessible via temporary url 2 | 3 | Note: This exercise is done against the Rackspace Public Cloud. 4 | 5 | 6 | We'll generate a temporary url to allow others to access the `hackspace/openstack-cloud-softare-vertical-small.png` file. 7 | 8 | First, we need to set a secret key on the account. Here we'll use `super-secret-key` as the key: 9 | 10 | $ swift post -m "Temp-URL-Key:super-secret-key" 11 | 12 | 13 | Next, we need to determine the full url of the object. For that, we need to get the storage url. We need to query the REST API directly for that: 14 | 15 | $ curl -i -s $ST_AUTH -H X-Storage-User:$ST_USER -H X-Storage-Pass:$ST_KEY | grep X-Storage-Url 16 | 17 | Output should look like: 18 | 19 | X-Storage-Url: https://storage101.iad3.clouddrive.com/v1/MossoCloudFS_4911155b-84c6-448b-b0f3-7db8f4887013 20 | 21 | In our example here, the storage URL is: 22 | * `https://storage101.iad3.clouddrive.com/v1/MossoCloudFS_4911155b-84c6-448b-b0f3-7db8f4887013` 23 | 24 | The full URL for the object is: 25 | * `https://storage101.iad3.clouddrive.com/v1/MossoCloudFS_4911155b-84c6-448b-b0f3-7db8f4887013/hackspace/openstack-cloud-softare-vertical-small.png` 26 | 27 | We can ensure this url works by making a HEAD request using an authentication token. First, retrieve an auth token: 28 | 29 | $ curl -i -s $ST_AUTH -H X-Storage-User:$ST_USER -H X-Storage-Pass:$ST_KEY | grep '^X-Auth-Token' 30 | 31 | Output should look like: 32 | 33 | X-Auth-Token: fac73d71321c4fdbac95ed8a183ff384 34 | Next, make a HEAD request against the object url, passing the auth token, and specifying that curl print out headers (`-i`): 35 | 36 | $ curl -i -X HEAD -H X-Auth-Token:fac73d71321c4fdbac95ed8a183ff384 https://storage101.iad3.clouddrive.com/v1/MossoCloudFS_4911155b-84c6-448b-b0f3-7db8f4887013/hackspace/openstack-cloud-software-vertical-small.png 37 | 38 | Output should look like: 39 | 40 | HTTP/1.1 200 OK 41 | Content-Length: 6685 42 | Content-Type: image/png 43 | Accept-Ranges: bytes 44 | Last-Modified: Sat, 02 Nov 2013 02:41:36 GMT 45 | Etag: 9ca71ae6465e5d4228e5c1e2f354c80c 46 | X-Timestamp: 1383360096.69969 47 | X-Object-Meta-Mtime: 1313113538.000000 48 | X-Trans-Id: txc7d304c99e6447ec85cca-00527470f2iad3 49 | Date: Sat, 02 Nov 2013 03:26:42 GMT 50 | 51 | 52 | We'll generate a temporary url that's good until Dec. 31, 2013 at 23:59:59. 53 | 54 | We need to write some Python code to do this. Note that we need the url path for generating the url. In the above case, it's `/v1/MossoCloudFS_4911155b-84c6-448b-b0f3-7db8f4887013/hackspace/openstack-cloud-software-vertical-small.png`, but your account name will be different. 55 | 56 | Save this to a file called `swifturl.py` and run it: 57 | 58 | ``` 59 | #!/usr/bin/env python 60 | import hmac 61 | import time 62 | from hashlib import sha1 63 | from datetime import datetime 64 | 65 | 66 | # Note: your account will be different here,change this 67 | account = "MossoCloudFS_4911155b-84c6-448b-b0f3-7db8f4887013" 68 | # You may need to change this 69 | host = "storage101.iad3.clouddrive.com" 70 | 71 | 72 | d = datetime(2013, 12, 31, 23, 59, 59) 73 | expires = int(time.mktime(d.timetuple())) 74 | path = "/v1/{0}/hackspace/openstack-cloud-software-vertical-small.png".format(account) 75 | key = 'super-secret-key' 76 | hmac_body = 'GET\n{0}\n{1}'.format(expires, path) 77 | sig = hmac.new(key, hmac_body, sha1).hexdigest() 78 | s = 'https://{host}{path}?temp_url_sig={sig}&temp_url_expires={expires}' 79 | url = s.format(host=host, path=path, sig=sig, expires=expires) 80 | print(url) 81 | ``` 82 | 83 | The URL should look something like: 84 | 85 | 86 | `https://storage101.iad3.clouddrive.com/v1/MossoCloudFS_4911155b-84c6-448b-b0f3-7db8f4887013/hackspace/openstack-cloud-software-vertical-small.png?temp_url_sig=ad1cad4ee2856c0a566636678e5ce023e84a577a&temp_url_expires=1388552399` 87 | 88 | This special url can be used to read the file until the expiry date. You 89 | should be able to acess the url in your browse. 90 | 91 | 92 | 93 | You're all done! Please [clean up] so somebody else can use your account. 94 | 95 | [clean up]: cleanup.md -------------------------------------------------------------------------------- /under-the-hood-compute.md: -------------------------------------------------------------------------------- 1 | # Under the hood: compute 2 | 3 | You should have one virtual machine instance running. If you are inside 4 | of the DevStack VM, you can check by doing: 5 | 6 | $ source ~/devstack/openrc 7 | $ nova list 8 | 9 | You should see something like: 10 | 11 | +--------------------------------------+------+--------+------------+-------------+--------------------------------+ 12 | | ID | Name | Status | Task State | Power State | Networks | 13 | +--------------------------------------+------+--------+------------+-------------+--------------------------------+ 14 | | fa1ddbab-417f-4890-abc1-4cdf2bbfa787 | test | ACTIVE | None | Running | private=10.0.0.3, 172.24.4.227 | 15 | +--------------------------------------+------+--------+------------+-------------+--------------------------------+ 16 | 17 | The default DevStack configuration uses QEMU to implement virtual machines, 18 | managed by libvirt. 19 | 20 | ## QEMU process 21 | 22 | You can see the qemu process that corresponds to the instance by doing: 23 | 24 | $ pgrep qemu | xargs ps ww 25 | 26 | The output should look something this: 27 | 28 | PID TTY STAT TIME COMMAND 29 | 23142 ? Sl 0:27 /usr/bin/qemu-system-x86_64 -S -M pc-1.0 -no-kvm -m 512 -smp 1,sockets=1,cores=1,threads=1 -name instance-00000001 -uuid fa1ddbab-417f-4890-abc1-4cdf2bbfa787 -smbios type=1,manufacturer=OpenStack Foundation,product=OpenStack Nova,version=2013.2.1,serial=ed198556-2d49-edcc-edd8-567f9a37549e,uuid=fa1ddbab-417f-4890-abc1-4cdf2bbfa787 -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/instance-00000001.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -kernel /opt/stack/data/nova/instances/fa1ddbab-417f-4890-abc1-4cdf2bbfa787/kernel -initrd /opt/stack/data/nova/instances/fa1ddbab-417f-4890-abc1-4cdf2bbfa787/ramdisk -append root=/dev/vda console=tty0 console=ttyS0 -drive file=/opt/stack/data/nova/instances/fa1ddbab-417f-4890-abc1-4cdf2bbfa787/disk,if=none,id=drive-virtio-disk0,format=qcow2,cache=none -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0 -netdev tap,fd=17,id=hostnet0 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=fa:16:3e:23:87:cf,bus=pci.0,addr=0x3 -chardev file,id=charserial0,path=/opt/stack/data/nova/instances/fa1ddbab-417f-4890-abc1-4cdf2bbfa787/console.log -device isa-serial,chardev=charserial0,id=serial0 -chardev pty,id=charserial1 -device isa-serial,chardev=charserial1,id=serial1 -usb -vnc 127.0.0.1:0 -k en-us -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 30 | 31 | ## Libvirt 32 | 33 | In the qemu process arguments, one of the arguments is `-name instance-00000001`. 34 | This is the domain name of the instance as seen by libvirt. You should be 35 | able to see that instance listed as a running domain by doing: 36 | 37 | $ sudo virsh list 38 | 39 | 40 | 41 | ## Virtual machine image files 42 | 43 | The files that correspond to the virtual machine are in 44 | `/opt/stack/data/nova/instances/`. These include the disk image, 45 | as well as the libvirt xml file. 46 | 47 | By default, DevStack uses QCOW2 images, which are copy on write. When 48 | OpenStack launches a new virtual machine, it copies the image file to 49 | `/opt/stack/data/nova/instances/_base`, and then creates a new qcow2 image 50 | in the `/opt/stack/data/nova/instances/` directory. 51 | 52 | Using the `file` command, you should be able to identify which is the original 53 | QCOW2 base image file that the disk image in `/opt/stack/data/nova/instances/` 54 | is copied from. 55 | 56 | 57 | ## Database 58 | 59 | OpenStack keeps persistent state in a MySQL database. The database corresponding 60 | to the Compute service is called `nova` and has many tables. 61 | 62 | Try going a quick query to get the uuid, the VM state, the instance name, 63 | and the name of the compute host which contains the hypervisor that the 64 | instance is running on: 65 | 66 | 67 | $ sudo mysql nova 68 | mysql> select uuid, vm_state, hostname, host from instances; 69 | +--------------------------------------+----------+----------+----------+ 70 | | uuid | vm_state | hostname | host | 71 | +--------------------------------------+----------+----------+----------+ 72 | | fa1ddbab-417f-4890-abc1-4cdf2bbfa787 | active | test | devstack | 73 | +--------------------------------------+----------+----------+----------+ 74 | 75 | 76 | The next exercise is [Under the hood: volumes]. 77 | 78 | [Under the hood: volumes]: under-the-hood-volumes.md 79 | -------------------------------------------------------------------------------- /under-the-hood-network.md: -------------------------------------------------------------------------------- 1 | # Under the hood: networking 2 | 3 | The networking is the most complex aspect of OpenStack. When you are running 4 | one virtual machine with a floating IP attached, your current DevStack 5 | deployment should have networking that has several virtual network interfaces 6 | (tap devices, veth pairs, Linux bridges, Open vSwitch bridges). 7 | 8 | ![Network devices](network-under-hood.png) 9 | 10 | Note that the exact name of the networking devices will vary, although the 11 | prefixes (`tap`, `qbr`, `qvb`, `qvo`, `qr-`, `qg-`, `br`) will be the same. 12 | 13 | 14 | All devices attached directly to Open vSwitch bridges are "internal ports", 15 | which are implemented as tap devices. 16 | 17 | 18 | You can list network interfaces by doing: 19 | 20 | $ ip a 21 | 22 | Note that not all of the network interfaces will appear in the list, because 23 | some are in different network namespaces. 24 | 25 | 26 | Also note that `eth0`, `eth1`, and `virbr0` are not involved here. In a production 27 | deployment, the br-ex bridge would be connected to a physical interface 28 | such as eth0. The `virbr0` bridge is a bridge created by libvirt that is 29 | not used by OpenStack. 30 | 31 | ## Security groups 32 | 33 | OpenStack uses iptables to implement security groups. The rules are applied 34 | to the virtual NIC (in the example above, `tapb5e2060e-02`). 35 | 36 | The name of the iptables chaian that controls the inbound rules for the instance 37 | with virtual NIC `tapb5e2060e-02` is called `neutron-openvswi-ib5e2060e-0`. 38 | 39 | Try to identify the name of the chain for your instance and list the rules. In 40 | the example above, it's: 41 | 42 | ``` 43 | $ iptables -L neutron-openvswi-ib5e2060e-0 44 | Chain neutron-openvswi-ib5e2060e-0 (1 references) 45 | target prot opt source destination 46 | DROP all -- anywhere anywhere state INVALID 47 | RETURN all -- anywhere anywhere state RELATED,ESTABLISHED 48 | RETURN tcp -- anywhere anywhere tcp dpt:ssh 49 | RETURN icmp -- anywhere anywhere 50 | RETURN udp -- 10.0.0.2 anywhere udp spt:bootps dpt:bootpc 51 | neutron-openvswi-sg-fallback all -- anywhere anywhere 52 | ``` 53 | 54 | Recall that we specified inbound traffic allowed on tcp port 22, and icmp. 55 | 56 | This rule allows the tcp inbound connections on the ssh port (22): 57 | 58 | RETURN tcp -- anywhere anywhere tcp dpt:ssh 59 | 60 | This rule allows the inbound traffic 61 | 62 | RETURN icmp -- anywhere anywhere 63 | 64 | Ideally, the virtual NIC would connect directly to the `br-int` Open vSwitch 65 | bridge. Unfortunately, due to an incompatibility between Open vSwitch and 66 | iptables, it is necessary to add a Linux bridge and a veth pair as a workaround 67 | to provide the L2 connectivity between the virtual NIC and `br-int`, while 68 | still having iptables rules apply to the virtual NIC interface. 69 | 70 | 71 | ## Network namespaces 72 | 73 | 74 | OpenStack Networking uses network namespaces to isolate networks by providing 75 | an isolated virtual networking stack. In particular, each network namespace 76 | has its own: 77 | 78 | * network interfaces 79 | * routing table 80 | * iptables rules 81 | 82 | To list the network namespaces, do: 83 | 84 | $ sudo ip netns list 85 | 86 | The output should look something like this: 87 | 88 | qrouter-9e5f2802-2462-4f5c-a95b-c60b99744451 89 | qdhcp-4b523b2a-5921-4e8b-9e64-7b668c4aab85 90 | 91 | As we'll see, you can also run an arbitrary commands inside of a network 92 | namespace using `ip netns exec `. 93 | 94 | 95 | ## Open vSwith bridges 96 | 97 | Try listing the Open vSwitch bridges, and the ports on each bridge: 98 | 99 | $ sudo ovs-vsctl list-br 100 | $ sudo ovs-vsctl list-ports br-int 101 | $ sudo ovs-vsctl list-ports br-ex 102 | 103 | You should be able to see ports that are attached to Open vSwtich bridges even 104 | if they are inside of a network namespace. 105 | 106 | ## DHCP service 107 | 108 | The `qdhcp-` network namespace contains the interface where the DHCP server 109 | listens for DHCP requsests from instances. 110 | 111 | There should be a `tap` device inside of the qdhcp- namespace. If you 112 | execute the `ip a` command inside of the namespace, it will list all of the 113 | networking devices. 114 | 115 | $ sudo ip netns exec qdhcp-4b523b2a-5921-4e8b-9e64-7b668c4aab85 ip a 116 | 117 | OpenStack uses dnsmasq for the networking. Ensure the dnsmasq service is 118 | lsitening on the appropriate `tap` device by doing: 119 | 120 | $ ps ww `pgrep dnsmasq` 121 | 122 | Look for the `--interface` argument to determine which interface it is listening 123 | on.. 124 | 125 | 126 | ## Routing and floating IPs 127 | 128 | Layer 3 routing and floating IPs are implemented inside of the `qrouter-` 129 | namespace. 130 | 131 | The `qg-` network interface will have its own IP address, and will also be 132 | assigned an IP address for each floating IP. 133 | 134 | Look at how the routing is configured between the OpenStack private network (10.0.0.0/24) 135 | and the OpenStack public network (172.24.2.) 136 | 137 | $ sudo ip netns exec qrouter-9e5f2802-2462-4f5c-a95b-c60b99744451 ip route show 138 | 139 | 140 | Floating IPs are implemented using iptables rules for doing network address 141 | translation. 142 | 143 | Look at the rules for the `nat` inside of your `qrouter` namespace 144 | 145 | 146 | $ sudo ip netns exec qrouter-9e5f2802-2462-4f5c-a95b-c60b99744451 iptables -t nat -S 147 | 148 | 149 | You should see commands for doing the NAT from 172.24.4.227 to 10.0.0.3, such as: 150 | 151 | ``` 152 | -A neutron-l3-agent-OUTPUT -d 172.24.4.227/32 -j DNAT --to-destination 10.0.0.3 153 | ... 154 | -A neutron-l3-agent-float-snat -s 10.0.0.3/32 -j SNAT --to-source 172.24.4.227 155 | ``` 156 | 157 | You can also see the rule for routing from the metadata service (`169.254.169.254`): 158 | 159 | ``` 160 | -A neutron-l3-agent-PREROUTING -d 169.254.169.254/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9697 161 | ``` 162 | 163 | 164 | You've completed the exercises! You can also try [generating a temporary url] 165 | with object storage. 166 | 167 | Finally, please [clean up] so somebody else can use your account. 168 | 169 | [generating a temporary url]: temp-url.md 170 | [clean up]: cleanup.md -------------------------------------------------------------------------------- /under-the-hood-object.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorin/openstack-hackspace/114023c031b3d72e348f98d267c5b266dde1fac2/under-the-hood-object.md -------------------------------------------------------------------------------- /under-the-hood-volumes.md: -------------------------------------------------------------------------------- 1 | # Under the hood: volumes 2 | 3 | You should have one volume attached to your instance: 4 | 5 | $ nova volume-list 6 | +--------------------------------------+--------+--------------+------+-------------+----------+--------------------------------------+ 7 | | ID | Status | Display Name | Size | Volume Type | Bootable | Attached to | 8 | +--------------------------------------+--------+--------------+------+-------------+----------+--------------------------------------+ 9 | | 16150e7c-92b1-4bfd-a425-450bf4de6f36 | in-use | myvolume | 1 | None | false | 291574d9-7445-4231-b248-bafbf3b116ec | 10 | +--------------------------------------+--------+--------------+------+-------------+----------+--------------------------------------+ 11 | 12 | ## LVM 13 | 14 | The default DevStack configuration uses LVM to implement volumes. DevStack 15 | uses an LVM volume group caled `stack-volumes`, which you can list using the 16 | `vgs` command: 17 | 18 | $ sudo vgs 19 | VG #PV #LV #SN Attr VSize VFree 20 | stack-volumes 1 1 0 wz--n- 10.01g 9.01g 21 | 22 | We can get a detailed display of all of the logical volumes: 23 | 24 | $ sudo lvdisplay 25 | --- Logical volume --- 26 | LV Name /dev/stack-volumes/volume-16150e7c-92b1-4bfd-a425-450bf4de6f36 27 | VG Name stack-volumes 28 | LV UUID UgFMV0-3uBM-r4p8-LCla-Kuk2-0Fvj-YFxCyB 29 | LV Write Access read/write 30 | LV Status available 31 | # open 1 32 | LV Size 1.00 GiB 33 | Current LE 256 34 | Segments 1 35 | Allocation inherit 36 | Read ahead sectors auto 37 | - currently set to 256 38 | Block device 252:0 39 | 40 | Note how the the volume name `volume-16150e7c-92b1-4bfd-a425-450bf4de6f36` 41 | matches the OpenStack volume ID `16150e7c-92b1-4bfd-a425-450bf4de6f36`. 42 | 43 | 44 | In a DevStack deployment, the physical volumes are backed by a file `/opt/stack/data/stack-volumes-backing-file` 45 | that is exposed as a loop device. Try running the following commands: 46 | 47 | $ file /opt/stack/data/stack-volumes-backing-file 48 | $ sudo losetup -a 49 | 50 | 51 | In a production OpenStack production that used LVM, the physical volumes 52 | would be actually disk partitions instead of files mounted as loopback devices. 53 | 54 | 55 | # iscsi 56 | 57 | OpenStack uses iSCSI to allow virtual machines to connect to LVM volumes on 58 | remote systems. 59 | 60 | In a DevStack deployment, the same system is both the iSCSI server and iSCSI 61 | client. In a production environment the LVM volumes would be located on a 62 | different physical machine than the one running the hypervisor. 63 | 64 | Try running the following command to view information about volumes that 65 | are being exported over iSCSI. 66 | 67 | $ sudo tgtadm --lld iscsi --op show --mode target 68 | 69 | 70 | 71 | The next exercise is [Under the hood: networking]. 72 | 73 | [Under the hood: networking]: under-the-hood-network.md 74 | -------------------------------------------------------------------------------- /under-the-hood.md: -------------------------------------------------------------------------------- 1 | # Under the hood 2 | 3 | In these exercises, we will be examining how OpenStack implements the 4 | compute, network, and volume storage. You should be logged in to 5 | the Rackspace instance where you installed DevStack. At this point, 6 | you should have already launched an instance, attached a floating IP to it, 7 | and attached a volume to it. 8 | 9 | Do this as the stack user to ensure you can use the OpenStack command-line 10 | tools: 11 | 12 | $ source ~/devstack/openrc 13 | 14 | --------------------------------------------------------------------------------