วันอังคารที่ 23 กุมภาพันธ์ พ.ศ. 2559

[go lang] Unit test with gorilla/mux

นั่งงมทำ unit test บน go กับ lib gorilla/mux มาครึ่งวัน เพราะเวลายิง test แล้ว มันไม่สามารถดึงตัวแปรได้

โดยปรกติเวลาเราสร้าง router บน gorilla/mux เราจะสร้าง


rtr.HandleFunc("/v1/exp/{UUID}", GetProductExp).Methods("GET")
เวลาดึงค่าก็ใช้
params := mux.Vars(r)
fmt.Println(params["UUID"]

แต่เวลาเราทำ unit test มันจะทำให้ function handle ของเราดึง var ออกมาไม่ได้เพราะถ้าเขียน unit test ปรกติจะเขียนประมาณ

func TestGetProductExp(t *testing.T) {
        fmt.Println("Testing GetProductExp")
        request, _ := http.NewRequest("GET", "/v1/exp/21a56778-6aad-4d90-aa16-6b5748a9f717", nil)
        response := httptest.NewRecorder()
        GetProductExp(response, request)
        fmt.Println(response.Body)
}

แต่เมื่อสั่ง go test ไปแล้วผลปรากฏว่า funcHandle ที่เขียนไว้ดึงค่าไม่ได้ทั้งๆที่ลอง run program ดูจริงๆแล้วลองยิง req ดูจริงๆแล้วมันก็อ่านค่าตัวแปรได้
ตอนหาข้อมูลมีคนเจอปัญหาเหมือนผมด้วย http://mrgossett.com/post/mux-vars-problem/
นั่งหาอ่านอยู่เกือบครึ่งวันกว่าจะได้คำตอบว่า lib gorilla/mux มันแปลงค่าตัวแปรให้มาอยู่ในรูป map[string]string ทำให้เวลายิงผ่าน test มันแปลงข้อมูลผิด ถ้าจะทำ unit test กับ gorilla/mux ให้เขียน test ประมาณนี้

func TestGetProductExp(t *testing.T) {
        fmt.Println("Testing GetProductExp")
        request, _ := http.NewRequest("GET", "/v1/exp/21a56778-6aad-4d90-aa16-6b5748a9f717", nil)
        response := httptest.NewRecorder()
        m := mux.NewRouter()
        m.HandleFunc("/v1/exp/{UUID}", GetProductExp)
        m.ServeHTTP(response, request)
        fmt.Println(response.Body)
}

วันจันทร์ที่ 8 กุมภาพันธ์ พ.ศ. 2559

Docker-machine create swarm on VULTR

เนื่องจากร้อนวิชาจากเมื่อวานที่ไปเรียน Docker swarm มาแต่ขัดใจหน่อยๆตรงที่ docker-machine มันมี driver มาตรฐานมาให้แค่ไม่กี่ตัว ที่ได้มีโอกาสใช้ก็คงมี aws,digitalocean,generic,virtualbox,azure,openstack พวก vmware คงไม่ได้มีโอกาสใช้สักเท่าไรเพราะ vmware ของที่ทำงานที่มีให้ส่วนมากจะเป็นแบบให้ vm มาเลยไม่ได้ให้เรา create vm เองได้



ผมได้รู้จัก VULTR มาพักใหญ่ละแต่ไม่ได้ใช้เพราะเสียดายวันฟรีของมันมันให้ใช้ฟรีได้ 2 เดือนใน 2 เดือนนี้ใช้อะไรก็ได้ในระบบโดยมีเงินให้ใช้ได้ 50$ ระบบแจกฟรีจะคล้ายๆ azure กับ bluemix คือให้ฟรีเงินมาเยอะๆแต่จำกัดวันใช้สั้นๆ ไม่เหมือน digital ocean ที่ให้เงินมาในระบบแล้ว คุณจะใช้ตอนไหนก็ได้ปิดเครื่อง+ทำลาย ไปเงินก็ไม่คิดเก็บไว้ใช้ได้นานๆ

VULTR มีอะไรดีกว่า Digitalocean บ้าง

  • disk ใช้ SSD เหมือน Digitalocean แต่ performance ดีกว่ามาก
  • ที่ราคา 5$ เท่ากัน VULTR ให้แรม 768MB แต่ให้ disk 15GB (disk น้อยกว่าแค่ 5 GB ผมว่าไม่เป็นปัญหาสำหรับ plan ราคาถูกนะครับอยากได้ performance ของ CPU & RAM มากกว่า)
  • มี local instant สำหรับทำ storage ใช้ disk จานหมุนธรรมดา ราคา 5$ ได้ disk ถึง 125 GB 
  • มี Snapshot ให้ใช้ Free!!!!!! (คิดว่าเดี๋ยวคงเก็บตัง)
  • ติดตั้ง OS จาก iso ของเราเองได้ 
  • มี DDOS protection ( เสียเงินเพิ่ม 10$ ต่อเดือน)
  • มี Dedicated instant ให้เลือก (2CPU 8GB-MEM 120GB-SSD 60$ ต่อเดือน)
  • มีเครดิตฟรีให้เล่น 50$ สมัครตาม https://www.vultr.com/freetrial/ นี้เลย หรือใครจะใจดีให้ referer ผมก็สมัครจาก link นี้ครับ http://www.vultr.com/?ref=6872558
VULTR ด้อยกว่า Digitalocean ตรงไหนบ้าง
  • เท่าที่เห็นตอนนี้ zone SEA ไม่มี server วางให้เลย ใกล้สุดคือ Japan และ Australia จากการทดสอบ ping โดยใช้ internet 3BB 10Mb ที่บ้าน ping ได้ผลดังนี้
    • digitalocean(SG) =50.210 ms
    • Vultr(JP) = 125.782 ms
    • Vultr(AU)=151.916 ms
จริงๆตอนแรกว่าจะเขียน driver vultr ให้กับ docker-machine เองไป hack มาละว่าเขียนไงไปหา go lib สำหรับ vultr มาแล้วด้วย https://github.com/JamesClonk/vultr/tree/master/lib กะว่าตื่นเช้ามาค่อยเอามาเขียน ก่อนนอนเล่นไปเล่นมา search ไปเจอมีคนทำ driver ไว้เสร็จเรียบร้อยแล้ว ใช้ lib ตัวเดียวกันกับที่ว่าจะเอามาเขียนเลย https://github.com/janeczku/docker-machine-vultr สรุปง่ายเลยไม่ต้องเขียนเองละเอามาใช้เลย

วิธีการติดตั้ง docker-machine-vultr driver 
  • ติดตั้ง docker , docker-machine ,golang
  • git clone https://github.com/janeczku/docker-machine-vultr.git
  • cd docker-machine-vultr && go get && make
  • cp build/docker-machine-vultr* /usr/local/bin/docker-machine-vultr
วิธีสร้าง consul
  • login เข้าไปใน VULTR เข้าไปที่ menu settings->API เพื่อ copy API key
  • docker-machine create -d vultr --vultr-api-key=[Your API] --vultr-os-id=193 --vultr-region-id=25 --vultr-plan-id=31 consul
    • vultr-os-id 193 = debian 8 x64
    • vultr-region-id 25 = jp
    • vultr-plan-id 31 = 5$ บน region jp

  • eval "$(docker-machine env consul)"
  • docker run -d --net=host --name=consul progrium/consul:latest -server -bootstrap-expect 1 -ui-dir /ui

วิธีสร้าง master


  • docker-machine create -d vultr --vultr-api-key=[Your API] --vultr-os-id=193 --vultr-region-id=25 --vultr-plan-id=31 --engine-opt cluster-store=consul://$(docker-machine ip consul):8500 --engine-opt cluster-advertise=eth0:2376 --swarm --swarm-master --swarm-discovery consul://$(docker-machine ip consul):8500/discovery master

  • eval $(docker-machine env --swarm master)
  • docker info

วิธีสร้าง node

  • docker-machine create -d vultr --vultr-api-key=[Your API] --vultr-os-id=193 --vultr-region-id=25 --vultr-plan-id=31 --engine-opt cluster-store=consul://$(docker-machine ip consul):8500 --engine-opt cluster-advertise=eth0:2376 --swarm --swarm-discovery consul://$(docker-machine ip consul):8500/discovery node-1

  • docker info

  • docker network create --driver overlay multihost
  • docker run -d --name=box1 --net=multihost nginx
  • docker run -d --name=box2 --net=multihost nginx
  • docker run -d --name=box3 --net=multihost nginx
  • docker ps

  • จะสังเกตว่า box1,box2 อยู่เครื่องเดียวกันส่วน box3 อยู่อีก เครื่องหนึ่ง (การเลือกเครื่องที่ติดตั้ง swarm จะเลือกให้เอง)
  • ทดสอบเข้าไปใน box1 แล้วลอง ping box2,box3 และ google ดู

ส่วนเรื่องความเร็วในการทำ provisioning นั้น อยู่ที่ประมาณ 3:30 นาทีโดยประมาณ
เรื่องความเร็วในการทำ provisioning อาจจะเป็นรอง digitalocean แต่สำหรับตอนนี้ใครที่อยากลองเล่น swarm ลองมาสมัคร VULTR ที่ให้เล่นฟรีแบบ 50$ 2 เดือนดู สามารถ create เครื่องขึ้นมาเล่นๆได้เป็น ร้อยๆเครื่องโดยไม่เสียเงินสักบาท  ส่วนเรื่อง performance ของเครื่องลองไปทดสอบกันดูครับว่าที่ผม review มานั้นจริงไหม

เรียน Docker swarm กับ Docker Swarm Maintainer

เมื่อวันเสาร์ที่ 6 ก.พ. 2559 ที่ผ่านมาได้มีโอการเข้าไปอบรมใน class Docker ที่ อ.ชาญวิทย์ (Docker Swarm Maintainer) เป็นคนสอน ซึ่งใช้ Docker 1.10.0 มาสอนกันเลย version นี้เพิ่งออกเมื่อวันที่ 5 ก.พ. ที่ผ่านมาด้วยน่าจะเป็น class แรกในโลกที่ใช้ Docker 1.10.0 มาสอน ถึงขนาด twitter หลักของ docker retweet ของ อ.ชาญวิทย์



ใน class สอนเรื่อง basic นิดหน่อย แต่ช่วงบ่ายจะเป็นช่วงของการลงลึกในเรื่องการสร้าง Swarm ด้วย docker-machine ใน class จะสร้าง swarm จาก driver ของ cloud ที่สร้างโดยใช้ Openstack ซึ่ง http://www.nipa.co.th/ เอามาให้ใช้บริการ ขอบอกว่า เร็วมากกก

กลับมาจากเรียนเริ่มร้อนวิชาอยากลองกับ docker-machine driver ตัวอื่นก็ลองไปเล่นกับ digitalocean ดูระบบทำขึ้นครับแต่ช้ากว่า Openstack ที่ nipa เอามาให้ทำ lab กันค่อนข้างมาก
provisioning ขึ้นบ้างไม่ขึ้นบ้าง ใช้เวลาเฉลี่ยประมาณ 2 นาทีนิดๆในการ provisioning แต่ละครั้ง
อ.ชาญวิทย์ก็เอา การบ้านของแต่ละคนที่ใช้ driver ต่างๆกันมาเปรียบเทียบความเร็วให้ดูได้ผลตามนี้ครับ



สรุปเป็นตารางความเร็วในการ provisioning ตามนี้