Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Simple example of subscribing to Rancher change events
/*
Setup:
npm install ws
Usage:
Create an API key in Rancher and start up with:
node socket.js address.of.rancher:8080 access_key secret_key project_id
*/
var WebSocket = require('ws');
var host = process.argv[2];
var accessKey = process.argv[3];
var secretKey = process.argv[4];
var projectId = process.argv[5];
var url = 'ws://'+accessKey+':'+secretKey+'@'+host+'/v1/projects/'+projectId+'/subscribe?eventNames=resource.change';
var socket = new WebSocket(url);
socket.on('open', function() {
console.log('Socket opened');
});
socket.on('message', function(messageStr) {
var message = JSON.parse(messageStr);
if ( message.name === 'ping' )
{
console.log('ping');
}
else if ( message.name === 'resource.change' && message.data )
{
var resource = message.data.resource;
var info = 'name='+resource.name + ', state='+resource.state;
if ( resource.transitioning !== 'no' )
{
info += ', transitioning='+resource.transitioning + ', message='+resource.transitioningMessage
}
console.log(message.resourceType, message.resourceId, 'changed:', info);
}
});
socket.on('close', function() {
console.log('Socket closed');
});
@arkka
Copy link

arkka commented Aug 15, 2016

NVM, i got it working!

It seem for python (or in my case), I'm required to login first using requests , retrieve the authorization response, then use it on websocket call.

 ws = websocket.WebSocketApp(url,
                                        on_open=self._on_open,
                                        on_message=self._on_message,
                                        on_error=self._on_error,
                                        on_close=self._on_close,
                                        header={'Authorization':self.api.token})

@vincent99
Copy link
Author

vincent99 commented Aug 15, 2016

@arkka The UI does use token auth, but basic with API keys works too.. They python library probably just doesn't support parsing ws://user:pass@host/path and turning that into the Authorization header ("Authorization: Basic " + base64encode("user:pass")).

?include= is sort of a hack put in for/used by the UI and is explicitly undocumented because it will probably be removed in a future API revision.

There is one other event name (eventNames=service.kubernetes.change) and that's about it.

@arkka
Copy link

arkka commented Aug 15, 2016

Exactly that's the problem @vincent99. It's seems the python library for websocket-client did not support it, and using base64 as my authorization token on header fix everything.

Thank you 👍

@alfrye
Copy link

alfrye commented Dec 6, 2018

I am using rancher 2.11 and after I get a few pings back from rancher the websocket closes with error code 1006. Any ideas?

I accessing the websocket from a node.js server

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment