From 58e85d0e465be634ff96fafe436e52501d63e365 Mon Sep 17 00:00:00 2001 From: Mike Shultz Date: Mon, 8 Jun 2020 16:26:07 -0600 Subject: [PATCH] adds ipfs-cluster REST API, and ipfs proxy changes --- ...ipfs-cluster-bootstrap-conf.configmap.yaml | 3 +++ .../ipfs-cluster-headless.service.yaml | 2 ++ .../templates/ipfs-cluster.ingress.yaml | 20 ++++++++++++++++++ .../templates/ipfs-cluster.service.yaml | 5 ----- .../kubernetes/values/origin/secrets-dev.enc | Bin 2693 -> 2693 bytes .../kubernetes/values/origin/secrets-prod.enc | Bin 942 -> 2771 bytes .../values/origin/secrets-staging.enc | Bin 942 -> 2767 bytes 7 files changed, 25 insertions(+), 5 deletions(-) diff --git a/devops/kubernetes/charts/origin/templates/ipfs-cluster-bootstrap-conf.configmap.yaml b/devops/kubernetes/charts/origin/templates/ipfs-cluster-bootstrap-conf.configmap.yaml index 20871c8b0bde..8984f1fb2fa6 100644 --- a/devops/kubernetes/charts/origin/templates/ipfs-cluster-bootstrap-conf.configmap.yaml +++ b/devops/kubernetes/charts/origin/templates/ipfs-cluster-bootstrap-conf.configmap.yaml @@ -26,6 +26,9 @@ data: ipfs-cluster-service init fi + # Listen on port 9094 (Cluster REST API) on all interfaces + sed -i -e 's/\/ip4\/127.0.0.1\/tcp\/9094/\/ip4\/0.0.0.0\/tcp\/9094/' /data/ipfs-cluster/service.json + PEER_HOSTNAME=`cat /proc/sys/kernel/hostname` grep -q ".*$SVC_NAME-0.*" /proc/sys/kernel/hostname diff --git a/devops/kubernetes/charts/origin/templates/ipfs-cluster-headless.service.yaml b/devops/kubernetes/charts/origin/templates/ipfs-cluster-headless.service.yaml index 1f3864006fc3..b71605140851 100644 --- a/devops/kubernetes/charts/origin/templates/ipfs-cluster-headless.service.yaml +++ b/devops/kubernetes/charts/origin/templates/ipfs-cluster-headless.service.yaml @@ -23,6 +23,8 @@ spec: port: 5001 - name: gateway port: 8080 + - name: clusterapi + port: 9094 # ipfsproxy here is the ipfs-cluster API proxy - name: ipfsproxy port: 9095 diff --git a/devops/kubernetes/charts/origin/templates/ipfs-cluster.ingress.yaml b/devops/kubernetes/charts/origin/templates/ipfs-cluster.ingress.yaml index 30da80e30150..c3c46283042f 100644 --- a/devops/kubernetes/charts/origin/templates/ipfs-cluster.ingress.yaml +++ b/devops/kubernetes/charts/origin/templates/ipfs-cluster.ingress.yaml @@ -63,6 +63,16 @@ spec: backend: serviceName: {{ template "ipfsCluster.fullname" . }} servicePort: 9999 # ipfs-proxy + - path: /add + backend: &cluster_api_service + serviceName: {{ template "ipfsCluster.fullname" . }} + servicePort: 9094 + - path: /id + backend: *cluster_api_service + - path: /version + backend: *cluster_api_service + - path: /pins + backend: *cluster_api_service - path: /api/v0/add backend: &api_service serviceName: {{ template "ipfsCluster.fullname" . }} @@ -91,6 +101,16 @@ spec: backend: serviceName: {{ template "ipfsCluster.fullname" . }} servicePort: 9999 # ipfs-proxy + - path: /add + backend: &cluster_api_service + serviceName: {{ template "ipfsCluster.fullname" . }} + servicePort: 9999 + - path: /id + backend: *cluster_api_service + - path: /version + backend: *cluster_api_service + - path: /pins + backend: *cluster_api_service - path: /api/v0/add backend: &api_service serviceName: {{ template "ipfsCluster.fullname" . }} diff --git a/devops/kubernetes/charts/origin/templates/ipfs-cluster.service.yaml b/devops/kubernetes/charts/origin/templates/ipfs-cluster.service.yaml index 45663f9efbce..1dd1dad8f5af 100644 --- a/devops/kubernetes/charts/origin/templates/ipfs-cluster.service.yaml +++ b/devops/kubernetes/charts/origin/templates/ipfs-cluster.service.yaml @@ -19,13 +19,8 @@ spec: # Most external usage is through ipfs-proxy, but ipns uses 8080 - name: swarm port: 4001 - - name: api - port: 5001 - name: gateway port: 8080 - # ipfsproxy here is the ipfs-cluster API proxy - - name: ipfsproxy - port: 9095 - name: clusterswarm port: 9096 - name: proxy diff --git a/devops/kubernetes/values/origin/secrets-dev.enc b/devops/kubernetes/values/origin/secrets-dev.enc index 91c91fa2c9c2370516d0e61b2107e538ab3b307b..5fa1b62393284811f738f5f25140059333bae8c6 100644 GIT binary patch literal 2693 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 literal 2693 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 diff --git a/devops/kubernetes/values/origin/secrets-prod.enc b/devops/kubernetes/values/origin/secrets-prod.enc index c336e903fcc336a1d9ddc1c532fedafa29cecfac..e37a5734005f7a220b66a2d7c05ad1936dc030f6 100644 GIT binary patch literal 2771 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 ZXLSb6W+(3dBqfBu<_0Iw5g;`n+vIiZT;c!# literal 942 zcmV;f15x}6Bmmg1&6;B~#6GzsAX$p?n0L?@5W(!N!#s)Dc6}%y_5l1Y6B30706<1h za;-BH%UNB&Dkc?!hAgCN6HxweB8%`Clrpp=^L}=y(BJ=U?T7PCN}!n(N#3WwE|#RD zAV#!gvt~ZX%E+>EBRndMY>9d+4!``oRQ~r}R33J->_D-2AQ65AkVD3s3OB7+>gi~_ zF|C6K#mHgl6(U1I_HPRs^j?GZd>BadY#k+1SKYfTbDh3YHkR52MgsX30f4IF7Cms&+=cBkAx2F1=8%UVvy}9h&0*dSa z*x0W;($RP7x=<9fpGxFHSfo{m-#Tk41Z{Tm`D(GByWWEkMplf?k-;|cX^bVegwewT z?8U}}CVcLH*$r{!;OlvNm5%wOEjL$0TEIGN>R+4qvK>9Vn<--t*plJFMokAsfR=2Y z!JVlA&8EP2PMD2(a&g2{!F&9~dMaUhXzt_$WhM9scd5UAc8q{F&5#k*U>vWnF6jk4a$w!SM27Qa#WzV&Xe~QApsE~@RhED>B*yt+cvP00UG#4bP z7-~h^*K;Kh3RRXfhRj>No8r!-K_o9mS}__fj$`N(!WG_L|Y_Ev~4;r&D%4Rolw;#JZ*8OU_5M z3pTM0pdp*c=JlF)uHvE(e`7J5{SxrZvlmF`wp(Px&fHU7z^YR4@bkVG5|A%wu+|5y z|BvcEzaz-Jww1H=%gLo8Zci1UQd`pCpNp7|m*+PIaZMC+k!w0w!+^l47JMSr5a|`a zL_4lKLfNSSsc{#RC3HLi2(`R-2;!)-Wm*Zb2gFa*M$tjaf512X`B%hx)Pq8@%EmOd zc^6s-(PtSE2rfGGaN-uX{bqAvo{r_ptS_OSSON?#r86p3bB~soSo(AJWJkEICbKWt Qk8xd76-x+}k8C^~Y3Gv9Gynhq diff --git a/devops/kubernetes/values/origin/secrets-staging.enc b/devops/kubernetes/values/origin/secrets-staging.enc index 8f81a8bc38fdf07ac45f2c191b08aa9b5f0d872f..7cda0927d2201499574fe049d80e41f2b9b540a7 100644 GIT binary patch literal 2767 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 V_>za+$)%nTPJ*(=)l&*-o9D6raAE)e literal 942 zcmV;f15x}6Bmmg1&6-QI?LdH@FZADk6-s4+Rq4}M+@TV)jg`^GL*XkWuM&j^06<1h zavZAK3e)HX|2e^7AIdi!x#0kp*D#6BDn*8$tBQ)r@(ZT?zlXF*Q}!2UX1Gt^N(}#m zKPIJzlr#h#zXreXb6Xs5fXp)@&CJKoO;OQGaHLU@pV}`SP%XV87vc|&2nT?w%<{CC zY4>2Giz?4MT_2Q9##<49HHAxCB&?DezOy}mGm!&R^CsnrR>uo1Ehe=rwV8FlN`=6P zrS%I0WYa`XYnzz(2TH#Iah$cH?O@b2N+LCc-4=;TSXF+~*GVUF5-GqHKng;7NAL;x zF6=Sz&@83O-VCx2E&Lp|-^^%&-?N(O>e@uIu#P0L(V1%fpiBW#2)|!E>L_Dhw8OnO zft7N58vf#pG0orrfER8wr2kdZhSIz@%l|~YqQ9vys^qa$BPdomLdfR14Pdl2gV9QJ zI&WIbR~Le;JCEKm!qv00V}i2m*Q{EPzcFJ^X%jNaxcnEw2P4K&hoUEg3kkLw4Gs=p zucZ_TeNvf}z-|(cEuaPf_{($Z$vr!R0QZu9kqT+dyx1qb@ZWqN$NY5Gw%a8N=s^1j zXC|T=YlwlY{>>wA%sDtsyLjt>&_KR~$URR0=6RXCP*8*Q4;GA+u!Y!ZPK=?vUely| z1%&)z{5ym_umI;H*CldcW}`78*%}ehkUxaQtd37qMY|F^pJ*3nJyF~Lg-RxcbM9J9UR1hnV QslxNkxV)@FT|jibS0R$np#T5?