GithubHelp home page GithubHelp logo

kushaldas / autocloud Goto Github PK

View Code? Open in Web Editor NEW
10.0 7.0 12.0 1.89 MB

License: GNU Affero General Public License v3.0

Python 63.68% JavaScript 5.42% CSS 9.99% HTML 19.94% Shell 0.38% Mako 0.60%

autocloud's Introduction

Autocloud

Setup

sudo dnf install fedfind

pip install -r requirements.txt
python setup.py develop
sudo mkdir -p /etc/autocloud; sudo cp config/autocloud.cfg /etc/autocloud/autocloud.cfg

Development

Create the database

python createdb.py

Run the fedmsg-hub

fedmsg-hub

Publish messages for testing

Run this command in a seperate terminal

python publish/publish_messages.py

Applying the migrations

alembic upgrade head

autocloud's People

Contributors

adamwill avatar kushaldas avatar praveenkumar avatar puiterwijk avatar ralphbean avatar rtnpro avatar sayanchowdhury avatar vivekanand1101 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

autocloud's Issues

Pull in fedimg AMI data

Right now fedimg is a system that listens for the same koji tasks over fedmsg that autocloud does. When it notices that a createImage task is done, it uploads the image to AWS as an AMI (it also runs a silly /bin/true test at the end, but not much else). When it is done, it publishes its own fedmsg message about its status.

It would be cool if autocloud could listen for not only koji tasks, but also for the fedmsg message that fedimg produces. autocloud could then test the fresh AMIs in EC2 itself. It could take the AMIs, deploy new nodes, and use tunir to login and run tests. autocloud could then display the status of those tests alongside the other image tests in its dashboard. autocloud would then serve as a frontend for fedimg where the websites team and the QA team could go to see what got uploaded and what didn't, what works and what doesn't.

Test the latest fedfind for autocloud

In the latest production deployment we found fedfind breaking for the Atomic composes. The upstream has already fixed the issue. We are also carrying a hotfix in the production. We need to carefully test the latest fedfind, and also remove the hotfix in the upcoming bugfix release.

Autocloud is unable to interpret the compose id

Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/moksha/hub/api/consumer.py", line 191, in _work
self.consume(message)
File "/usr/lib/python2.7/site-packages/fedimg/consumers.py", line 71, in consume
cmetadata = fedfind.release.get_release_cid(compose_id).metadata
File "/usr/lib/python2.7/site-packages/fedfind/release.py", line 64, in get_release_cid
return get_release(cid=cid)
File "/usr/lib/python2.7/site-packages/fedfind/release.py", line 380, in get_release
(release, milestone, compose, respin) = parse_cid(cid)
File "/usr/lib/python2.7/site-packages/fedfind/release.py", line 337, in parse_cid
(release, date, typ, respin) = fedfind.helpers.parse_cid(cid)
File "/usr/lib/python2.7/site-packages/fedfind/helpers.py", line 347, in parse_cid
"compose ID!".format(origcid))
ValueError: Fedora_Docker-25-20170110.0 does not appear to be a valid Pungi 4 Fedora compose ID!

Traceback with new architectures

Autocloud should not crash when new architectures get added....

[Sat Mar 04 14:13:26.245350 2017] [wsgi:error] [pid 7093] ERROR:autocloud.web.app:Exception on /jobs/ [GET]
[Sat Mar 04 14:13:26.245354 2017] [wsgi:error] [pid 7093] Traceback (most recent call last):
[Sat Mar 04 14:13:26.245355 2017] [wsgi:error] [pid 7093]   File "/usr/lib/python2.7/site-packages/flask/app.py", line 1988, in wsgi_app
[Sat Mar 04 14:13:26.245357 2017] [wsgi:error] [pid 7093]     response = self.full_dispatch_request()
[Sat Mar 04 14:13:26.245358 2017] [wsgi:error] [pid 7093]   File "/usr/lib/python2.7/site-packages/flask/app.py", line 1641, in full_dispatch_request
[Sat Mar 04 14:13:26.245360 2017] [wsgi:error] [pid 7093]     rv = self.handle_user_exception(e)
[Sat Mar 04 14:13:26.245362 2017] [wsgi:error] [pid 7093]   File "/usr/lib/python2.7/site-packages/flask/app.py", line 1544, in handle_user_exception
[Sat Mar 04 14:13:26.245363 2017] [wsgi:error] [pid 7093]     reraise(exc_type, exc_value, tb)
[Sat Mar 04 14:13:26.245365 2017] [wsgi:error] [pid 7093]   File "/usr/lib/python2.7/site-packages/flask/app.py", line 1639, in full_dispatch_request
[Sat Mar 04 14:13:26.245366 2017] [wsgi:error] [pid 7093]     rv = self.dispatch_request() 
[Sat Mar 04 14:13:26.245368 2017] [wsgi:error] [pid 7093]   File "/usr/lib/python2.7/site-packages/flask/app.py", line 1625, in dispatch_request
[Sat Mar 04 14:13:26.245369 2017] [wsgi:error] [pid 7093]     return self.view_functions[rule.endpoint](**req.view_args)
[Sat Mar 04 14:13:26.245371 2017] [wsgi:error] [pid 7093]   File "/usr/lib/python2.7/site-packages/autocloud/web/app.py", line 140, in job_details
[Sat Mar 04 14:13:26.245372 2017] [wsgi:error] [pid 7093]     request.referrer, dict(request.args)).paginate()
[Sat Mar 04 14:13:26.245374 2017] [wsgi:error] [pid 7093]   File "/usr/lib/python2.7/site-packages/autocloud/web/pagination.py", line 49, in paginate
[Sat Mar 04 14:13:26.245375 2017] [wsgi:error] [pid 7093]     page_items = self.get_ordered_page_items()
[Sat Mar 04 14:13:26.245377 2017] [wsgi:error] [pid 7093]   File "/usr/lib/python2.7/site-packages/autocloud/web/pagination.py", line 76, in get_ordered_page_items
[Sat Mar 04 14:13:26.245378 2017] [wsgi:error] [pid 7093]     items = self.queryset.all()
[Sat Mar 04 14:13:26.245380 2017] [wsgi:error] [pid 7093]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/query.py", line 2613, in all
[Sat Mar 04 14:13:26.245381 2017] [wsgi:error] [pid 7093]     return list(self)
[Sat Mar 04 14:13:26.245382 2017] [wsgi:error] [pid 7093]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/loading.py", line 86, in instances
[Sat Mar 04 14:13:26.245384 2017] [wsgi:error] [pid 7093]     util.raise_from_cause(err)
[Sat Mar 04 14:13:26.245385 2017] [wsgi:error] [pid 7093]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/util/compat.py", line 202, in raise_from_cause
[Sat Mar 04 14:13:26.245387 2017] [wsgi:error] [pid 7093]     reraise(type(exception), exception, tb=exc_tb, cause=cause)
[Sat Mar 04 14:13:26.245388 2017] [wsgi:error] [pid 7093]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/loading.py", line 71, in instances
[Sat Mar 04 14:13:26.245390 2017] [wsgi:error] [pid 7093]     rows = [proc(row) for row in fetch]
[Sat Mar 04 14:13:26.245391 2017] [wsgi:error] [pid 7093]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/loading.py", line 428, in _instance
[Sat Mar 04 14:13:26.245396 2017] [wsgi:error] [pid 7093]     loaded_instance, populate_existing, populators)
[Sat Mar 04 14:13:26.245398 2017] [wsgi:error] [pid 7093]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/orm/loading.py", line 486, in _populate_full
[Sat Mar 04 14:13:26.245400 2017] [wsgi:error] [pid 7093]     dict_[key] = getter(row)
[Sat Mar 04 14:13:26.245401 2017] [wsgi:error] [pid 7093]   File "/usr/lib64/python2.7/site-packages/sqlalchemy/sql/type_api.py", line 1030, in process
[Sat Mar 04 14:13:26.245403 2017] [wsgi:error] [pid 7093]     return process_value(value, dialect)
[Sat Mar 04 14:13:26.245404 2017] [wsgi:error] [pid 7093]   File "/usr/lib/python2.7/site-packages/sqlalchemy_utils/types/choice.py", line 169, in process_result_value
[Sat Mar 04 14:13:26.245406 2017] [wsgi:error] [pid 7093]     return self.type_impl.process_result_value(value, dialect)
[Sat Mar 04 14:13:26.245407 2017] [wsgi:error] [pid 7093]   File "/usr/lib/python2.7/site-packages/sqlalchemy_utils/types/choice.py", line 196, in process_result_value
[Sat Mar 04 14:13:26.245409 2017] [wsgi:error] [pid 7093]     return Choice(value, self.choices_dict[value])
[Sat Mar 04 14:13:26.245410 2017] [wsgi:error] [pid 7093] KeyError: u'aarch64'

RFE: Please differentiate the image name in fedmsg for vagrant libvirt vs virtualbox

Currently both the Vagrant box types share the same image_name of Fedora-Cloud-Atomic-Vagrant and there's no good way to differentiate without doing heuristic checks on the image_url field of the fedmsg. I would like to request they have different image_name fields.

Example libvirt box:

{
  "source_name": "datanommer", 
  "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUViakNDQTllZ0F3SUJBZ0lDQWgwd0RRWUpL\nb1pJaHZjTkFRRUZCUUF3Z2FBeEN6QUpCZ05WQkFZVEFsVlQKTVFzd0NRWURWUVFJRXdKT1F6RVFN\nQTRHQTFVRUJ4TUhVbUZzWldsbmFERVhNQlVHQTFVRUNoTU9SbVZrYjNKaApJRkJ5YjJwbFkzUXhE\nekFOQmdOVkJBc1RCbVpsWkcxelp6RVBNQTBHQTFVRUF4TUdabVZrYlhObk1ROHdEUVlEClZRUXBF\nd1ptWldSdGMyY3hKakFrQmdrcWhraUc5dzBCQ1FFV0YyRmtiV2x1UUdabFpHOXlZWEJ5YjJwbFkz\nUXUKYjNKbk1CNFhEVEUxTURreU5URTBOVGsxTTFvWERUSTFNRGt5TWpFME5UazFNMW93Z2Z3eEN6\nQUpCZ05WQkFZVApBbFZUTVFzd0NRWURWUVFJRXdKT1F6RVFNQTRHQTFVRUJ4TUhVbUZzWldsbmFE\nRVhNQlVHQTFVRUNoTU9SbVZrCmIzSmhJRkJ5YjJwbFkzUXhEekFOQmdOVkJBc1RCbVpsWkcxelp6\nRTlNRHNHQTFVRUF4TTBZWFYwYjJOc2IzVmsKTFdGMWRHOWpiRzkxWkMxaVlXTnJaVzVrTURFdWNH\naDRNaTVtWldSdmNtRndjbTlxWldOMExtOXlaekU5TURzRwpBMVVFS1JNMFlYVjBiMk5zYjNWa0xX\nRjFkRzlqYkc5MVpDMWlZV05yWlc1a01ERXVjR2g0TWk1bVpXUnZjbUZ3CmNtOXFaV04wTG05eVp6\nRW1NQ1FHQ1NxR1NJYjNEUUVKQVJZWFlXUnRhVzVBWm1Wa2IzSmhjSEp2YW1WamRDNXYKY21jd2da\nOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFMRERsQW44NE1oOU5zdUt3SUJVMGZG\nOQphVDFRV1ZucVVEWSs1b3dUM05ITDI5U2JZV1RXOU5LUkczNnYrR201QU9ocldQVXFBaXZaQUda\nT0tuTElwM1JFClVWeXpWZEV5ODRmYlFHK1hjTXAwK0NST2d6bmlodmgzNktXMWRPK3pobGdNQ1Ry\nUEFzNk50ZVFmZ1ZMRDNISWQKUGxFMGZNSkZCQkVKNVhWZHR3bkJBZ01CQUFHamdnRlhNSUlCVXpB\nSkJnTlZIUk1FQWpBQU1DMEdDV0NHU0FHRworRUlCRFFRZ0ZoNUZZWE41TFZKVFFTQkhaVzVsY21G\nMFpXUWdRMlZ5ZEdsbWFXTmhkR1V3SFFZRFZSME9CQllFCkZOb2xrL0xrM0c3MEl3L0VxUElPNmRm\nNkRZQzRNSUhWQmdOVkhTTUVnYzB3Z2NxQUZHdEFXdmtTQ0lsWjUxbmwKQmZVQ0hRcE9meFFBb1lH\nbXBJR2pNSUdnTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNCTUNUa014RURBTwpCZ05WQkFj\nVEIxSmhiR1ZwWjJneEZ6QVZCZ05WQkFvVERrWmxaRzl5WVNCUWNtOXFaV04wTVE4d0RRWURWUVFM\nCkV3Wm1aV1J0YzJjeER6QU5CZ05WQkFNVEJtWmxaRzF6WnpFUE1BMEdBMVVFS1JNR1ptVmtiWE5u\nTVNZd0pBWUoKS29aSWh2Y05BUWtCRmhkaFpHMXBia0JtWldSdmNtRndjbTlxWldOMExtOXlaNElK\nQU9OUUhrZFBGeDVGTUJNRwpBMVVkSlFRTU1Bb0dDQ3NHQVFVRkJ3TUNNQXNHQTFVZER3UUVBd0lI\nZ0RBTkJna3Foa2lHOXcwQkFRVUZBQU9CCmdRQ003ZFlHNDBrWjRYcm9ERk5wWm44Sm0yZnFPU09F\ndU9BejYwbU5uY1lvK0pjL2wzbCtRMCtPak0yY0NiUDQKZ29RSVBMQmZVcHJvV20yeE9OZnIzUlF2\nMVNJbUE1cGdtUVVOM3pCMjllUThKRW43dmF4ZU83b1VtUE9hUy9lWgpZUXEzVzV6d3N1TmpTNGlS\nMHh2VCtMTCtlYk5wU3lSQjgrZVhRc0YyeE8yTXlBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0t\nLQo=\n", 
  "i": 42, 
  "timestamp": 1444655221.0, 
  "msg_id": "2015-7ba7d6fd-432f-43cd-8406-a67ff0127fe2", 
  "topic": "org.fedoraproject.prod.autocloud.image.queued", 
  "source_version": "0.6.5", 
  "signature": "Ez1igWMFikAJln0NccVLGchcs0ktsEUG1TPCV4LTnwrYGODX72X/Ok9K6FFZYZApvcUlqxi3OvfL\nvi9B0vNrwkBu83YtvVvUVg0mUZf2v+7Be4Pa1Hv1kT+9e69ewiZOOb7RF/i93LZLFhP4jKPv05wD\n0LbOs+GyHgucSD/wYSg=\n", 
  "msg": {
    "status": "queued", 
    "job_id": 262, 
    "buildid": 11414712, 
    "image_name": "Fedora-Cloud-Atomic-Vagrant", 
    "image_url": "https://kojipkgs.fedoraproject.org//work/tasks/4712/11414712/Fedora-Cloud-Atomic-Vagrant-rawhide-20151012.x86_64.vagrant-libvirt.box", 
    "release": "rawhide"
  }
}

Example virtualbox box:

{
  "source_name": "datanommer", 
  "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUViakNDQTllZ0F3SUJBZ0lDQWg0d0RRWUpL\nb1pJaHZjTkFRRUZCUUF3Z2FBeEN6QUpCZ05WQkFZVEFsVlQKTVFzd0NRWURWUVFJRXdKT1F6RVFN\nQTRHQTFVRUJ4TUhVbUZzWldsbmFERVhNQlVHQTFVRUNoTU9SbVZrYjNKaApJRkJ5YjJwbFkzUXhE\nekFOQmdOVkJBc1RCbVpsWkcxelp6RVBNQTBHQTFVRUF4TUdabVZrYlhObk1ROHdEUVlEClZRUXBF\nd1ptWldSdGMyY3hKakFrQmdrcWhraUc5dzBCQ1FFV0YyRmtiV2x1UUdabFpHOXlZWEJ5YjJwbFkz\nUXUKYjNKbk1CNFhEVEUxTURreU5URTBOVGsxT1ZvWERUSTFNRGt5TWpFME5UazFPVm93Z2Z3eEN6\nQUpCZ05WQkFZVApBbFZUTVFzd0NRWURWUVFJRXdKT1F6RVFNQTRHQTFVRUJ4TUhVbUZzWldsbmFE\nRVhNQlVHQTFVRUNoTU9SbVZrCmIzSmhJRkJ5YjJwbFkzUXhEekFOQmdOVkJBc1RCbVpsWkcxelp6\nRTlNRHNHQTFVRUF4TTBZWFYwYjJOc2IzVmsKTFdGMWRHOWpiRzkxWkMxaVlXTnJaVzVrTURJdWNH\naDRNaTVtWldSdmNtRndjbTlxWldOMExtOXlaekU5TURzRwpBMVVFS1JNMFlYVjBiMk5zYjNWa0xX\nRjFkRzlqYkc5MVpDMWlZV05yWlc1a01ESXVjR2g0TWk1bVpXUnZjbUZ3CmNtOXFaV04wTG05eVp6\nRW1NQ1FHQ1NxR1NJYjNEUUVKQVJZWFlXUnRhVzVBWm1Wa2IzSmhjSEp2YW1WamRDNXYKY21jd2da\nOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFOYnRHYlMrNWZDTEM0SlljcGRja0RC\nTgpSNUpSNmtvUXBVVlBnZ3V5R3JaaC8ya1B6dmRRcWtiQy8waG9zUlJnU3pTcC9ac3BBbkN1T21G\nSnd4czF0aDhFCjNqRTRsbjd3VjBTMUpNb3NOMHVzVmNEczlaaEljM0p2bTU5SkdTTUdKWFlXeHpG\nMjVoQlBYMjJOVVExdVlUaDQKem5KL3B3Z3VaajBjZFZPMC9LMVpBZ01CQUFHamdnRlhNSUlCVXpB\nSkJnTlZIUk1FQWpBQU1DMEdDV0NHU0FHRworRUlCRFFRZ0ZoNUZZWE41TFZKVFFTQkhaVzVsY21G\nMFpXUWdRMlZ5ZEdsbWFXTmhkR1V3SFFZRFZSME9CQllFCkZIcXIrTWx5R2hmVUZkREF5V2xnbG5j\ncFlvWmlNSUhWQmdOVkhTTUVnYzB3Z2NxQUZHdEFXdmtTQ0lsWjUxbmwKQmZVQ0hRcE9meFFBb1lH\nbXBJR2pNSUdnTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNCTUNUa014RURBTwpCZ05WQkFj\nVEIxSmhiR1ZwWjJneEZ6QVZCZ05WQkFvVERrWmxaRzl5WVNCUWNtOXFaV04wTVE4d0RRWURWUVFM\nCkV3Wm1aV1J0YzJjeER6QU5CZ05WQkFNVEJtWmxaRzF6WnpFUE1BMEdBMVVFS1JNR1ptVmtiWE5u\nTVNZd0pBWUoKS29aSWh2Y05BUWtCRmhkaFpHMXBia0JtWldSdmNtRndjbTlxWldOMExtOXlaNElK\nQU9OUUhrZFBGeDVGTUJNRwpBMVVkSlFRTU1Bb0dDQ3NHQVFVRkJ3TUNNQXNHQTFVZER3UUVBd0lI\nZ0RBTkJna3Foa2lHOXcwQkFRVUZBQU9CCmdRQXI4ODF3UUVyT2ozWUFRNWQwMGx3aHJtV0dzclM3\nVGJoZ2xEa01JN3l5VDdFdE95dk54VC9lQlZkZEF0WU4KTWR4enBQK3B2TitaRkZtTmw4YklyVlJ4\ncjJsYUxWWDNhakJxVDcrVWEyMldRVFJnNFlLZGEzT0VsaEd2VmRiawpVU3FKS3ppbktLOGJneDdC\ndVZXY1hseDVsbUg5ZWF3RDRxYVVFdTE2Y2JCN25RPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0t\nLQo=\n", 
  "i": 18, 
  "timestamp": 1444655225.0, 
  "msg_id": "2015-3430b083-8ae1-4745-b743-be6d4f632d36", 
  "topic": "org.fedoraproject.prod.autocloud.image.queued", 
  "source_version": "0.6.5", 
  "signature": "DsrwkgC724N7PI2nwIYWS/gm9cHd0bBDGPR9efzBHjp8Zqy5kaEAMGTkbOsU9cxt/I7D6cPORNhj\nyOEoplra8InICJvS9qfS0r6ygN9IQJWaplKKPoTNhWF7ctf0E/FvariaVLUxobZ9pAfYcYkqY1pW\n+rI1d53/ynmbwyY8y7o=\n", 
  "msg": {
    "status": "queued", 
    "job_id": 261, 
    "buildid": 11414712, 
    "image_name": "Fedora-Cloud-Atomic-Vagrant", 
    "image_url": "https://kojipkgs.fedoraproject.org//work/tasks/4712/11414712/Fedora-Cloud-Atomic-Vagrant-rawhide-20151012.x86_64.vagrant-virtualbox.box", 
    "release": "rawhide"
  }
}

RFE: show image type in jobs overview

Right now, https://apps.fedoraproject.org/autocloud/jobs/ shows IDs and success, but it'd be nice to know if the image is Atomic or Base, which architecture, and which Fedora release it's built on.

It might also be nice to have pre-release images and post-release images highlighted differently (that is, if it's F23 testing branch, or F22 + updates), and Rawhide too, for that matter.

Add an API

It would be very helpful if autocloud had an API. The only feature I'd immediately need is a very simple one: go to a URL and get the results of the autocloud test for a specific Koji build ID.

So for instance I could go to https://apps.fedoraproject.org/autocloud/api/v1/job/12604897 and get a simple JSON (or whatever) representation of the job; basically it could simply give all the JobDetails attributes except possibly 'output' (which is pretty big). You could obviously implement other end points, like one for listing/querying jobs, but I don't need that right now myself (dunno if anyone else does).

This should be really pretty trivial to implement with flask-restful or flask-restless - I think with flask-restless it'd be like a handful of lines of code. See https://flask-restless.readthedocs.org/en/latest/quickstart.html and https://flask-restful.readthedocs.org/en/latest/quickstart.html .

If you don't have cycles to work on this I can do it, but I think it might be a bit quicker for you if you don't mind :)

RFE: Command line tool to abort a job

During service restart, or due to super bad images, we have few jobs as always running status. We need a command line tool which can mark those jobs as aborted in the DB, and will send out the corresponding fedmsg.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.