deploying 3 times a day without a downtime @ rocket tech summit in berlin

122
Deploying 3 times a day without any downtime Alessandro Nadalin - VP Tech @ Namshi.com Rocket Tech Summit 2015 - September 2015 - Berlin

Upload: alessandro-nadalin

Post on 23-Feb-2017

1.388 views

Category:

Technology


0 download

TRANSCRIPT

Deploying 3 timesa day withoutany downtimeAlessandro Nadalin - VP Tech @ Namshi.comRocket Tech Summit 2015 - September 2015 - Berlin

When was the last time that *.namshi.com was down?

I don’t know

I should know

Probably now.

SOA

SOA

~40 services

SOA

~40 services

docker

SOA

~40 services

docker

heavy on JS

SOA

~40 services

docker

heavy on JSdevoted to experimenting

SOA

~40 services

docker

heavy on JSdevoted to experimenting

Result?

A bit of history...

“When are you guys gonna deploy it?”

“In 2 weeks”

(2012)

“Sometime this week”

(2013)

“Possibly today”

(2014)

Now.

This is how it works@ Namshi

We don’t like centralization

Single Point of Failure

On error, rollback all the things!

Black sheep syndrome

Ship it

Don’t wait tomorrow for what you can get today

Result?

Microservices

microservice-based teams

~40 services * ⅔ people = ~100 engineers

~15 people rotate, assume different roles

project-based teams

quality over quantity

“addingmanpowerto a late

project makesit later”

https://goo.gl/Bc0uBf

Communicationoverhead

takes time to getused to the

whole thing

keep things small, flat, plain and simple

means small teams, simple software

What is the simplest wayto get devs their

development environment?

FROM alpine

RUN apk add --update nodejs

COPY . /src

CMD node /src/index.js

FROM alpine

RUN apk add --update nodejs

COPY . /src

CMD node /src/index.jsDocker

How long does it taketo get started with anyof the microservices?

git clone [email protected]:namshi/stuff.git

cd stuff

echo “127.0.0.1 stuff.namshi.com” >> /etc/hosts

docker-compose up

git clone [email protected]:namshi/stuff.git (20s)

cd stuff

echo “127.0.0.1 stuff.namshi.com” >> /etc/hosts

docker-compose up

git clone [email protected]:namshi/stuff.git (20s)

cd stuff (...)

echo “127.0.0.1 stuff.namshi.com” >> /etc/hosts

docker-compose up

git clone [email protected]:namshi/stuff.git (20s)

cd stuff (...)

echo “127.0.0.1 stuff.namshi.com” >> /etc/hosts (...)

docker-compose up

git clone [email protected]:namshi/stuff.git (20s)

cd stuff (...)

echo “127.0.0.1 stuff.namshi.com” >> /etc/hosts (...)

docker-compose up (depends on the image)

git clone [email protected]:namshi/stuff.git (20s)

cd stuff (...)

echo “127.0.0.1 stuff.namshi.com” >> /etc/hosts (...)

docker-compose up (~5s with alpine)

~ (master ✔) � docker images | grep watchdog

watchdog_web [...] 38.74 MB

Make it so that it takes<2m to start hacking

on your services

Make it simple.

How do we get thisstuff to production?

FROM alpine

RUN apk add --update nodejs

COPY . /src

CMD node /src/index.js

FROM alpine

RUN apk add --update nodejs

COPY . /src

CMD node /src/index.jsIt’s that simple

.

Ok, but how do I get todeploy the container?

There’s a botfor everything

@c3po deploy app1 patch-1 to staging

All it takes is a 100 locs or so

Is it really without a downtime?

We’re actually down every time we deploy

it’s just that no one notices

keep a secondary setup up&running

deploy there (with downtime), switch the LB

http://martinfowler.com/bliki/BlueGreenDeployment.html

Everything seems simple,but how do you glue all

of this?

github.com/namshi/roger

github.com/namshi/roger

We build following fewprinciples:

Resilient

"Resilience is accepting your [...] reality"

https://en.wikipedia.org/wiki/Elizabeth_Edwards

Robust

"Be conservative in what you send, be liberal in what you accept"

https://en.wikipedia.org/wiki/Robustness_principle

Simple

"Innovation is saying no to 1,000 things"

http://www.goodreads.com/quotes/629613-people-think-focus-means-saying-yes-to-the-thing-you-ve

Safe

"Each calling function must check non-void function return values, and the validity of parameters must be checked inside each function."

http://sdtimes.com/nasas-10-rules-developing-safety-critical-code/

Pragmatic

"Each calling function must check non-void function return values, and the validity of parameters must be checked inside each function,unless you are 1000% freaking sure"

http://sdtimes.com/nasas-10-rules-developing-safety-critical-code/

How does the typicalworkflow look like?

spend time spec-ing things outbefore accepting them in the backlog

“if it’s not simple enough, it’s wrong”

+1 from a lead, less formal review from peers

“more deletions, less additions”

“we process 5 builds in parallel,don’t piss others off”

“don’t test everything,just what you fear”

Then, Go Live.

Takeaways?

break everything down

MVA

MVA

novice engineers are the ones who can’t abstract

MVA

novice engineers are the ones who can’t abstract

senior engineers are the ones who can abstract

MVA

novice engineers are the ones who can’t abstract

senior engineers are the ones who can abstract

great engineers are the ones who know when to abstract

heterogeneous, committed team

avalanche of go-live

failure is always an option

Dystopian architecture

Dystopian architecture

http://www.infoq.com/news/2013/05/dystopia-as-a-service

Challenges?

queues of deployments

parallel deployments based on cookie

everything is new

use the internal infra as a testing platform

manual QA

simplify the dangerous stuff, think 3ice before touching

think mobile

Desktop is the new Blackberry

Whether you arerunning everything

through an isomorphicJavaScript framework

every day

https://eng.asana.com/2014/02/scaling-asana-com/ & https://asana.com/luna

or fatass ruby frontends

30 times a day

https://github.com/blog/1241-deploying-at-github

or you’re justthat crazy

every 11.6 seconds

https://news.ycombinator.com/item?id=2971521

(in 2011)

https://news.ycombinator.com/item?id=2971521

Roll it out live.

github.com/odino

twitter.com/_odino_

odino.org

VP Technology

github.com/namshi

twitter.com/TechNamshi

tech.namshi.com

CREDITShttps://www.flickr.com/photos/keoni101/5145003933/in/photolist-8QDuqn-9onbtL-98NqNJ-bpre1J-bCm9ov-5nspQa-gFXppe-7RZ4xk-8Ct1ds-7KgJJQ-bWMzAU-9BiH5F-bprhCU-bCmcZK-bprhuE-

nXqr1M-bCm9BF-9JcPvT-bprdBS-bCm8oM-gGBZfK-5iatLr-8EZw4m-8UHQhk-8SCpW4-qP9K5T-agZDMz-eP4mF-jSRwF-k5MQvX-8mfGks-fZ3Ybf-fZ3YdE-fZ3Yvo-fZ3Vc8-fZ3LjY-acpv98-TXHG-k5SvYL-8EVHuL-k5TK4G-k5PakZ-xtWznE-7jUCPz-ptnrW5-9EKb64-549pn1-nWGvvK-5nwJRW-bbBnct

https://www.flickr.com/photos/kodomut/6736910191/in/photolist-bgjqFZ-oK6wi7-cAPsgw-du2eXy-fPYjvm-Ldmf-8UJyvL-cjuPWh-7ouhnG-3jFShG-7cDUKd-5RGCpJ-okMaW-8XNkq-kZXpCS-4zLS4V-bpq2Be-6gCEDA-nPDiLh-8CsTbz-8UFvqD-eUNqSW-kBNAV-8s5ooq-xroyz-qrWR6-nEoXY-2aNAQA-oBKJZZ-4EYx1j-czxuvm-8UJz39-6vYKE8-aahUEo-8UFwz2-epWYsQ-9tkdUT-ejb2fA-9bGFZ8-sDNq9j-

tNcTSP-6PQjU-kutg5F-b1qbNa-axLrfZ-tNcDh6-emc9G6-6XpcCq-8UFvKg-9tkecDhttps://www.flickr.com/photos/jfgornet/9782373576/in/photolist-fUrdRo-iiRme5-3dphWV-qbi7CS-295V7V-oVYVkK-whiv-5bSqL6-bCAzX7-e43Tvu-5bXgrN-9Po1MM-9PrdzW-eVaqAj-aDdYbB-cryeCf-

d2W3u-fUr7Ca-8QPJin-bRvh2i-7bHRv8-9jDPRs-ARgb7-unsLMg-5Rmbqk-gpzfbq-4uS6uw-s2nje-v2HTyQ-7mKESL-e1RHJu-7oAes-8iLVD3-dq3xC9-67yUML-dq3nBr-dq3xiq-viLYuJ-uni1uh-dq3nFK-bpC4Cd-crycDs-vjCJN4-v2RhyV-9PqRLW-8ZMuCv-dq3xqh-dRi3hi-wmRFPW-8yVu3e

https://www.flickr.com/photos/bill-fellow/4059471685/in/photolist-7bHRv8-9jDPRs-ARgb7-unsLMg-5Rmbqk-gpzfbq-4uS6uw-s2nje-v2HTyQ-7mKESL-e1RHJu-7oAes-8iLVD3-dq3xC9-67yUML-dq3nBr-dq3xiq-viLYuJ-uni1uh-dq3nFK-bpC4Cd-crycDs-vjCJN4-v2RhyV-9PqRLW-8ZMuCv-dq3xqh-dRi3hi-wmRFPW-8yVu3e-v2qEcV-vjCGGv-rXSAuw-2sAvon-qmT7s4-9YWFmv-4sJryS-9zMU3w-

67rfWu-67mARP-67qDSS-ebSx8M-2URQyo-3Aphtk-6W3md6-5W36P7-4hkUXk-crye1L-295V8t-jeVgzehttps://www.flickr.com/photos/alan-light/7615187330/in/photolist-cAVPTh-hBX91g-hcpiXt-6n2KSB-7BcSDW-6ZZBB2-7BcSv3-9KdE9P-hBXcre-MAxEu-Lwj7H-bCgeBe-euumXn-cBWjH-a8NebL-5ZooTX-9KdE4T-pMk9k9-oD6BGT-ZqpRg-cURCRh-52xgrx-8p2uw8-9BPa4-518mMG-662bdz-xGaDRX-2zSHXX-5SxTvs-8K1pKQ-53xG2q-53truc-9s2uWR-cHDiXs-8rad18-dFFXGM-9s36vn-9s5TGu-

fEdhRE-5j7ekh-5j7eiW-6ii1k3-9mQH9Q-9KdEea-6HriJ1-6VZwQT-87sR7j-5aTwhd-bFzizn-59Dkdihttps://www.flickr.com/photos/virtualsugar/372136216/in/photolist-yTi8E-maMzdd-8RFFez-bEQKGX-fEAEJ3-t5s62j-29mCH-dykJ1U-qgFzoc-ffh4SP-5mTEZY-cvijZ7-xJ38eN-dHxCmf-qwZcFJ-

mQ9EYH-ciUqAG-6VUTzH-9zRGmF-9KeU3d-2DVBG-3e8A-9yvWyr-bHqKkp-cc7knY-92u8oY-iyeiSA-4TUSm1-4ZD3vw-qrjaAz-4dSJ4e-buvXYL-rwXX4Z-9NUE1F-5rwYT5-rxpxx1-oDCcdr-viNKVU-5oM9mP-ax7WJ4-hLCvT-nwfVm-dyff3V-DykQR-by9ag-7DzVio-63NxSa-9Lm6rU-9hme9H-9Lm5Ej

https://www.flickr.com/photos/greenoid/16365496287/in/photolist-qWarT6-5N947S-bDBRvz-51uAdq-5ZEPea-dZbtit-atypb1-fnuXsK-cSbmLN-6nPMgk-cHGG4A-8Lr7o3-8Lo4CK-6n2W2z-bQmB9K-5x2oRB-8Lr8MW-8Lr8cE-seCNBZ-5dRyGJ-im4teH-9yxT46-9yATJE-7dWhf1-24J4S-bBoVQo-jgHyNo-cs1Q47-p7EHQp-9irsTV-9ktqn1-9HmoJD-y4fGn-fpF8U8-85R4Yj-76jHPe-8ByuRV-4ZwkyA-67DsR2-

b27Jzc-9sfnyg-6nfwZm-8E3w4T-7Di8BH-7Di8ot-7Di8bp-bLdvw-ekLdGQ-jEWJfL-icwf4nhttps://www.flickr.com/photos/aigle_dore/15571693270/in/photolist-pJ1ZUb-8omGZn-pjwoda-pHZeyg-7sMyvU-5QjZw-k253ZL-4Jhwqr-vmPmUH-oXoNz5-awif3w-9jKjEN-ea6V4H-91qx9Q-qUPGF2-

7SrRAw-rWqAho-5HFn2P-wEp54m-3dTtJR-9om4e5-2NENJw-a3yfbr-of4Vwg-p9xCZs-54e3RM-wxbkv8-kjQiui-rWyKW8-b2Jq4R-wG699M-iiEtfF-oRPrpe-vXGiLo-boRv1i-wxweWU-6qpJih-hZ2n8J-cW8Kfs-xLBstF-tKKQUm-5PPqVj-8omhkX-ppMdyd-aCzjww-dHmpqy-se2nf2-dGka9m-bVSXic-dfJeU7

https://www.flickr.com/photos/intvgene/370973576/in/photolist-yMkw9-2auo-97ji6E-4wuofP-tGWXu6-59ktec-59pCrN-59pBRW-5VxirZ-9U3veb-8sWpQY-iSEFkV-9cfBr2-9boLH5-6mSB7s-aKpAmx-4fUsNL-7vEVv7-8BPU1e-5hC1EA-4j1h7w-9aTAwj-7vEVHQ-87V3bY-cee2wo-3KDNbn-9SiXWP-7ASTkd-4jpvQH-7vB7fR-59pGDh-jagpmg-59pEN7-8nDt9B-6xFmn-ruwDs-hfwXP-4qBiH6-59pHBJ-aCvLMi-

59kxJk-5B3jzN-4qB8yx-7TBNEZ-59pKod-ehoEq3-okMnQt-4fUzTo-7vB7oB-6b4BVYhttps://www.flickr.com/photos/levork/2869703078/in/photolist-5nzYKh-4iSxJx-h84kt-7zQ7Zc-96Bkfr-4DB4yG-9vNc4G-8z9rd4-jb4gtt-xj8dC-p2EwTb-7Qbfeu-7Jqm5K-4UAU46-k2MVwr-xj8mr-

97mizy-enB6mH-enDw5D-enE9AK-96VRju-7ZC3Mu-9Ty6t2-c3fj5-aB3JJg-aB6gM3-aB6ePw-6HvAUJ-6HrxUc-3aQjbL-bY4Vv3-6gwRWM-86uABy-6HvAN7-pE83F3-7HNQgW-7HNQ25-7HJUhk-dtQ5L6-dtQ5y4-dtQ5g2-dtQ5M8-dtQ5yZ-dtVDAy-dtQ5uV-dtQ5gv-dtVDLQ-dtVDu1-dtVDdm-dtQ5AP

https://www.flickr.com/photos/bribri/267441683/in/photolist-pCH6v-rLg5vA-fJc7bv-fJfSdF-fJxnbQ-fJfNri-fJxm33-6mNbXo-cYAyXs-4qTrcR-9gTBHx-6xTonW-fJtGmq-3UM5cm-5MquU1-uqnsNy-5EGt56-dQBQtP-emiLxz-74hbx5-igpt93-pwFrQh-pv3MGX-ofL8zQ-6RDxtD-dMY3D4-r6xmyT-doxPLP-v5VCax-5z5qJV-p1u3gM-r3WFZr-bxVboc-9AXWjP-pMu5wR-awx1qC-4ZoEL1-9QeBRK-tZ8Ndq-

9RhoRv-6mNaDj-6mHYKp-6mJ2ip-6mNaTU-6mHYhk-fJc7qV-7JtbPS-bEsPJC-6TqzCL-4aGX1shttps://www.flickr.com/photos/leehaywood/4215672566/in/photolist-7qwqzL-612xaV-xrbJu9-r2EX8b-o4ZJ4i-5Ydqw4-eimaUN-7KF23a-csn2TY-83RpRh-earXnG-8noT5N-pN3mtW-8QU4ii-pDJzKg-

6NroHq-6nTq7H-6ypk1S-dNxLKB-93a3ez-93d9xS-5uChhT-ATm2Y-8CgeyZ-o87Kh-db38BP-3zS9vf-qj6ZnP-93d9cE-93a25B-cB9MEA-2FJcT-dTUsFR-6JG6He-6vhRC-939YAZ-4Q4Rta-37H1HU-8r8Aaj-8YffL4-6CVtJ6-aCjbRF-aeujs6-fvL94X-8F8azb-8S6Axf-5ZhqeG-ib6Z8-8yhgcf-939ZaD

https://www.flickr.com/photos/michaelpardo/16239379663/in/photolist-qK24Nx-5zNShb-7hdF1N-aCGDqT-afSi2z-oF4Q25-4vg5r4-53Zde-5ZSEaZ-45ykWT-hXsmSY-5gAZhi-eBWbNx-kdhPYV-e6Z13z-9Qf8CN-4JNbcv-4TLGoA-9BV2oD-k54mxX-nGTp9Q-6Bh5W8-iYfjhp-a1rCX-qHHLFw-7xJmdm-6cnNX3-6rg4Hy-4oiMrb-dWy8JX-5MsJqJ-g8PYx8-oVfk37-oSLAA2-6hSNgn-5yXjAn-3eWKix-

c5L67s-65vYNC-2kbdGp-6RjTi4-33gRyW-aqCdny-9JvstH-nJFecd-6Ky3Ep-duWt8G-d2XwjL-52iHYy-ouB4ohhttps://www.flickr.com/photos/by-sgillies/4612006879/in/photolist-82xJXZ-cH76wU-cH74UW-cH7241-7NavgS-qSR3Xh-7J5ZjK-4no65H-digoTb-rrf9DT-iyh6mh-nHwfDd-dS9xSd-nRiqpa-7Nav6q-

5Xetug-fL5h6a-cH7ZhL-fL5gK2-cH81Cu-fLmU6E-pXevyv-cH83gf-k5XBHG-k5XCGW-uTyZeN-G9G6P-o82Pzi-pXG2eb-fQAYgs-pV9mkH-4jJBCj-6RTT4E-9MMPxt-bEny6x-7y2oog-6RBMg4-oJ5d1-82xJYP-boW8ch-8mLDsb-7N6vaZ-9ZADoF-hhHCC-9Zu1rK-5CAxDp-pXew48-8zWQaY-8zTHCt-pVshzw

https://www.flickr.com/photos/neontommy/8195166220/in/photolist-dubnpj-39syS9-5o5PPy-j7D7EJ-6w1VMD-8CPRdi-ijya6J-j7C6kS-am7F3K-nCWmUT-5o5PsS-j7zRvk-ik38xz-fJ7fv7-39sG4U-pgQ9Vq-pgQsL3-j7AFHU-fHPqjn-78k5jh-fJ79DU-2Z5exe-2Z9xEo-2Z4ZZ4-78k5ts-fHPGkD-5mmzdQ-du5KYH-d8oyUJ-j7Ekx7-j7DfTj-fJ7aXL-dsvB5q-gSsvhS-jvpHqe-78k4yQ-fJ7bc5-kpH4fu-fJ7fbq-

wae8P6-5seA8D-2Z9FLS-fJ7eFG-ik2B4j-5nXctH-pzdFgF-78k5bW-nXdjwF-8BkoQ5-8Bko8yhttps://www.flickr.com/photos/usaghumphreys/8123584654/in/photolist-dnRuGo-dnRChm-dnRwnQ-dnRjct-dnRpVD-dnRoMt-dnRtjG-dnRmdM-dnRzdJ-ciiL4u-5fHLEC-d4FjFC-d4Fpz3-d4FqtL-d4FnAE-d4FmsG-oYAmF3-eQNeGZ-2kEMeF-75qwdj-ebyApV-wLi3HY-bfRnrT-d6mRoo-c3xXnN-bfRnmF-tCgNcj-ucvFdf-eh4VY3-oYACLu-oKxku2-2JYUEY-2JYVbC-w94YoH-vccJTi-pGTvix-4PuaWC-

9Roc2Y-d7tX4A-w25JNv-dmGuP6-cLDcUd-brBPoP-dgpf8B-eSZMX9-edMWRi-q53feK-waq2BV-cK6QBL-2VRKtLhttps://www.flickr.com/photos/twid/3013680713/in/photolist-5AiUhi-5Aobef-5AoaZj-qj1xqY-oGXJb-LJsXv-8hNkFU-aqzAxZ-pn5z1W-6G2dgg-5p3Xf7-pjmPrf-c6GraN-bCbSK5-5p3XmY-6G4BYN-6ABLFC-8342MV-6p1CvA-nLZJK8-5sbZyn-bz6bV3-snq1XE-7MZgN6-pncatE-c5Abhy-4FVwG9-a3Np9x-qJLptH-oXsh3G-bDVGiR-6oWAog-4igtMe-8jAq4w-97MixC-6AUZt-47yNA5-9bcWfH-7CFnNH-

4XnWfX-6ZYojh-2yTdoG-qMQvWw-63yGHT-92FCN4-4FVwcy-fpg8-pEEow9-bE9fDc-uw1FLnhttps://www.flickr.com/photos/robin1966/16252834424/in/photolist-qLd2rb-71XJX3-oFh9Lf-pbGmj7-9piRsv-wV3Voc-dHydjE-97ZEyz-8NEx3U-ntssed-49mxGt-dHydTq-9kbHQZ-vCShQ-gs9VG3-

97Zy1r-cDwCAS-4UDXk1-82WxrU-89ubgX-dHsMCB-k28MG3-bA2uTS-cZ9Ktw-cXmS4G-dHebrV-dedzHL-cXgdzY-jHn9PM-ekKpLa-97ZyPa-bEWeyt-acAuAB-9kbJNP-cXmmXS-cXfDbh-cYBCQy-goTmeg-dtG73y-cXjfMq-oehG4N-4YUVVD-nYQ2NE-82TpLP-9teNoy-9ZBiFi-cXgwFN-cYRXwh-khZCKr-cXfRBw

https://www.flickr.com/photos/hktang/4243300265/in/photolist-7sY2kp-3aFY7-anLPHW-iUCPSN-riy1sB-9Qk6W7-foYszt-5gvyUL-dVy7PS-98FH5a-iKHZLF-51mAYh-5gqShD-ksPKNd-r1qxFW-375zuh-pGvQbe-7x3sBg-pPnsBG-4nkFqL-cPrJzS-9t5oE8-vc5KA-reiprC-vTcSxB-5V9pju-7HHHCa-7vXv6S-9ywJev-nPf5ar-6zveL1-93ysED-4MpKK9-2VUyZL-9xMCJe-dSwkqa-7bmxL7-u9RHxu-51mAxC-

ffDKR8-pPh5H-r1QJ1N-XP4Qt-7hLVq7-9R8Dv4-hNGJ65-fLBHyT-hNGTwh-9DpTpt-4LCh5phttps://www.flickr.com/photos/gsfc/12209193235/in/photolist-jATiMD-eWpyyD-aG3Pcc-aUux8-5Uc9Fn-eWB8XC-2BQcU-qiyn4c-7PGYNQ-phJDQk-eWpHhp-cSiy4U-axXAYt-7BRK6G-7PDTLx-7Q5tpT-

2BQeH-aqCa22-7Ptm4u-pdYMRC-do2QEF-5stXWy-6y4QUE-5spAvg-aqCa32-dr1P3R-c3ocB5-bizfM-7Q1xwZ-4CViS4-9y3cgk-dx76a9-7PDXj6-bCRXLB-86mdyj-axZEky-7PDS94-oY1BkX-axZxvE-8K8Sw7-axZMsW-8Nxttu-aqC9Vg-7dMYwz-82VGZM-Maa4f-bizgK-6FPXuX-7PXyc5-7PDV34

https://www.flickr.com/photos/peterme/1253686915/in/photolist-2UMtrD-2UMBv6-2USbfE-2URYmh-2UMBVp-2UMv54-2UMzQF-q8h49G-kJkWG-2UMMmr-2UMMRT-2US6P3-2US695-2UMGgT-2UMxn4-2US4pf-4JNAp4-257iwn-atU3wi-8jbQxi-oMsNA-6P7otR-fhfVs7-naBjky-adVc4z-4qFFE2-pbpkgi-pQMaf8-bLANFx-5SUYtc-pQM9RH-edxG5v-bLANBX-8Lejk5-AD3JQ-q7YtFx-pkDRki-5xgGUy-

5us9C9-257jdr-drtUTS-kYEvbW-dx6D7U-X7oNE-6Rseze-b5J9GP-4Af9Wu-5SQ13B-pbmApw-naBoL9https://www.flickr.com/photos/opensourceway/5537457201/in/photolist-9rjV72-c3vzMW-6TyZng-58xAj6-bwdC97-8fL4R6-rCE4XT-vYaSD2-7JUU7P-atCKP5-6Q7466-4boAmW-gFWgPr-93Nfb3-

yUbTj-q1TobB-D9s7z-86Kywi-cGMG9S-K4mGV-bER864-8eSYcF-4bjyva-8SXnr1-wJh5Vf-vcxb7L-nmSXYZ-i6KbA-4bozRh-pU4HhE-63narx-4MjXTb-4ZAk72-47Apyk-bWhBF1-4YSqGT-7RC7eF-9fEkF3-5uZMFQ-pkDuwi-asX4ws-514qqR-8S4Xon-HgpXC-K6KDR-7Q7xJT-ee6kCu-8272cg-edHTVF-3gNReU