Coder Social home page Coder Social logo

ansible-nae's Introduction

ansible-nae

Cisco NAE has been integrated into Cisco Nexus Dashboard Insights. This project will not be developed going forward. Please refer to the ND Ansible collection (https://github.com/CiscoDevNet/ansible-nd) for on-going development, support and enhancement requests.

The ansible-nae project provides an Ansible collection for managing and automating your Cisco NAE environment. It consists of a set of modules and roles for performing tasks related to NAE.

Note: This collection is not compatible with versions of Ansible before v2.8.

Requirements

Ansible v2.8 or newer requests requests_toolbelt jsonpath_ng

Install

Ansible and other requirements must be installed

sudo pip install ansible requests requests-toolbelt jsonpath_ng pathlib filelock

Install the collection

ansible-galaxy collection install cisco.nae

Use

Once the collection is installed, you can use it in a playbook by specifying the full namespace path to the module, plugin and/or role.

- name: NAE Testing
  hosts: all
  vars:
    nae_login: &nae_login
        host: 1.1.1.1
        port: 443  
        username: Admin
        password: password  
    validate_certs: False
  tasks:
  - name: Create a pre-change analysis from file
    nae_prechange:
      <<: *nae_login
      ag_name: FAB2
      file: config.json
      name: New
      state: present
  - name Create Online Assurance Group (with APIC Configuration Export Polciy)
    nae_ag:
      <<: *nae_login
      state: present
      name: AG1
      online: True
      apic_hostnames: 1.2.3.4
      apic_username: admin
      apic_password: password
...

RoadMap

Pre-change analysis

  • Configure PCA
  • Start/Stop/Query PCA

Epoch Delta

  • Configure Delta Analysis
  • Query Delta Analysis Result

Compliance Analysis

  • Create/Update/Read/Delete
    • Object Selectors
    • Traffic Selector
    • Compliance Requirement
    • Compliance Requirement Sets
  • Create Associate/Disassociate a requirement set with an AG
  • Report Creation

Assurance Group Management

  • Create/Update/Read/Delete Online Assurance Group
    • Configure F5 Load Balancer
  • Create/Update/Read/Delete Offline Assurance Group

Offline File Management

  • Upload/Delete/Get a File

Online/Offline Analysis

  • Create/Start/Stop/Delete Online Analysis
  • Create/Start/Stop/Delete Offline Analysis

Smart Events

  • Get smart events by Type/Severity
  • Export Smart Events in CSV format
  • Smart Event Suppression
    • Create/Update/Delete/Read Even suppression rules
    • Create/Update/Delete/Read Even suppression rules sets
    • Activate a rules set with an AG
    • Associate/Disassociate a requirement set with an AG

TCAM Analysis

  • Export TCAM stats as CSV

Appliance Management

  • Create/Update/Delete/Read Users

Testing latest code

If you wanna test the latest code you can:

  • Clone this repo
  • ansible-galaxy collection build --force
  • ansible-galaxy collection install cisco-nae-* --force

ansible-nae's People

Contributors

anshulbehl avatar anvitha-jain avatar camrossi avatar lhercot avatar shan-kulk avatar shrsr avatar xinyuezhao avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ansible-nae's Issues

Typo in def get_compliance_object

This is not correct and cause the code not to work.

elif self.params.get('selector') == 'requirement_sets':

It should be requirement_set

Support access via Proxy

If a proxy is in the middle (tested with Cisco dCloud access) the login will fail.
I this is is because we are not saving the "SRVNAME" Cookie inserted by the proxy.
As a consequence the proxy will then not recognise the session and strip all the custom cookies like the OTP one as we can see in #32

Requirement Set API endpoint changed in NAE 5.1

As of NAE 5.1 this end point:

https://%(host)s:%(port)s/nae/api/v1/event-services/assured-networks/%(fabric_uuid)s/model/aci-policy/compliance-requirement/requirement_sets/%(obj_uuid)s

Is now

https://%(host)s:%(port)s/nae/api/v1/event-services/assured-networks/%(fabric_uuid)s/model/aci-policy/compliance-requirement/requirement-sets/%(obj_uuid)s

the requirement_sets became requirement-sets

Add Automated testing

We need to add a complete set of automated tests to ensure all the modules are working as expected every time there is a commit.

Start/Stop Assurance Groups

We should add to the AG Module to capability to start/stop an online analysis.

We should support these 3 use cases:

  • Start
  • Run X times
  • Stop

Note: This is a customer request

Deleting a non existing requirement-sets, requirement traffic or object selector results in module crash

  1. We should not crash if the req set, Requirement or selector or does not exists
  2. A warning should be printed saying the object does not exits.
    We need to handle this for 'object','traffic','requirement' and 'requirement_set' selectors
- name: Delete Requirement Sets
  cisco.nae.nae_compliance:
    <<: *nae_login
    name: test
    state: absent
    selector: requirement_set

The full traceback is:
Traceback (most recent call last):
  File "<stdin>", line 102, in <module>
  File "<stdin>", line 94, in _ansiballz_main
  File "<stdin>", line 40, in invoke_module
  File "/usr/lib/python3.6/runpy.py", line 205, in run_module
    return _run_module_code(code, init_globals, run_name, mod_spec)
  File "/usr/lib/python3.6/runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/tmp/ansible_cisco.nae.nae_compliance_payload_npduknyp/ansible_cisco.nae.nae_compliance_payload.zip/ansible_collections/cisco/nae/plugins/modules/nae_compliance.py", line 170, in <module>
  File "/tmp/ansible_cisco.nae.nae_compliance_payload_npduknyp/ansible_cisco.nae.nae_compliance_payload.zip/ansible_collections/cisco/nae/plugins/modules/nae_compliance.py", line 163, in main
  File "/tmp/ansible_cisco.nae.nae_compliance_payload_npduknyp/ansible_cisco.nae.nae_compliance_payload.zip/ansible_collections/cisco/nae/plugins/module_utils/nae.py", line 1315, in delete_requirement_set
  File "/tmp/ansible_cisco.nae.nae_compliance_payload_npduknyp/ansible_cisco.nae.nae_compliance_payload.zip/ansible_collections/cisco/nae/plugins/module_utils/nae.py", line 1238, in get_compliance_object
IndexError: list index out of range
fatal: [192.168.66.64]: FAILED! => {
    "changed": false,
    "module_stderr": "Traceback (most recent call last):\n  File \"<stdin>\", line 102, in <module>\n  File \"<stdin>\", line 94, in _ansiballz_main\n  File \"<stdin>\", line 40, in invoke_module\n  File \"/usr/lib/python3.6/runpy.py\", line 205, in run_module\n    return _run_module_code(code, init_globals, run_name, mod_spec)\n  File \"/usr/lib/python3.6/runpy.py\", line 96, in _run_module_code\n    mod_name, mod_spec, pkg_name, script_name)\n  File \"/usr/lib/python3.6/runpy.py\", line 85, in _run_code\n    exec(code, run_globals)\n  File \"/tmp/ansible_cisco.nae.nae_compliance_payload_npduknyp/ansible_cisco.nae.nae_compliance_payload.zip/ansible_collections/cisco/nae/plugins/modules/nae_compliance.py\", line 170, in <module>\n  File \"/tmp/ansible_cisco.nae.nae_compliance_payload_npduknyp/ansible_cisco.nae.nae_compliance_payload.zip/ansible_collections/cisco/nae/plugins/modules/nae_compliance.py\", line 163, in main\n  File \"/tmp/ansible_cisco.nae.nae_compliance_payload_npduknyp/ansible_cisco.nae.nae_compliance_payload.zip/ansible_collections/cisco/nae/plugins/module_utils/nae.py\", line 1315, in delete_requirement_set\n  File \"/tmp/ansible_cisco.nae.nae_compliance_payload_npduknyp/ansible_cisco.nae.nae_compliance_payload.zip/ansible_collections/cisco/nae/plugins/module_utils/nae.py\", line 1238, in get_compliance_object\nIndexError: list index out of range\n",
    "module_stdout": "",
    "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
    "rc": 1

nae_compliance object selectors creation idempotency issue

When you create an object selector that already exist, the task fails with "msg": "Object Selector with the provided name already exists. Use a different name." Then it does NOT continue with the next tasks.

Step to re-create:
Run twice a playbook that creates object selectors and that has at least 2 tasks.

Workaround:
Adding "ignore_errors: yes" on the object selector creation task allows the play to continue.

Delete tenant: Parsing not correct

If I have a playbook that delete a tenant:

    - name: Delete Tenant
      aci_tenant:
        <<: *aci_login
        name: '{{ tenantName }}'
        descr: 'CDCI'
        state: absent
        output_path: 'config.json'

When the nae_prechange module is run the file is not parsed and we try to upload this to NAE:
[{"fvTenant": {"attributes": {"dn": "uni/tn-tenant", "status": "deleted"}}}]

The expected format is:
{"totalCount": "1", "imdata": [{"fvTenant": {"attributes": {"name": "tenant", "descr": "CDCI", "dn": "uni/tn-tenant", "status": "deleted”}}}]}

As a work around you can add another object to be deleted (say a VRF) and in that case the parsing works however there is then another issue: NAE returns this error: "msg": "Required attribute "name" missing for type "fvTenant"."

However ACI will accept the config, might be a cobraSDK limitation. Need to check on that more.

Module should fail if log in is unsuccessful

In this example a proxy is removing the OTP cookie resulting in the login process to fail.
However the module will just return success and move on.

We should fail.


ok: [candid.svpod.dc-05.com] => (item=Change Management) => {
    "ansible_loop_var": "item",
    "changed": false,
    "invocation": {
        "module_args": {
            "apic_hostnames": "",
            "apic_password": "",
            "apic_username": "",
            "description": null,
            "export_apic_policy": false,
            "host": "candid.svpod.dc-05.com",
            "name": "Change Management",
            "online": false,
            "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
            "port": 8443,
            "state": "present",
            "username": "admin",
            "validate_certs": false
        }
    },
    "item": "Change Management",
    "msg": "The One Time Password (OTP) password was either not specified or has expired and is no longer valid"

If the queried PCV does not exist, return a failure

The nae_prechange module will return a success code if the PCV is querying does not exist.

This should not happen: If the nae_prechange module is used in a CICD pipeline the pipeline will move to the next step (tested with Jenkins) and it should not as we were unable to verify the Pre Change Analysis

Add support for remote AAA domains

Hello,

Please add the support for non-Local AAA domains.
Currently only Local is supported as a AAA domain (hardcoded in nae.py).

Also, would be worth to mention the fact that currently only Local is supported in the docs for the module.

file upload broken

As part of commit 46a7c8e the following check was introduced:
https://github.com/CiscoDevNet/ansible-nae/blob/master/plugins/module_utils/nae.py#L1393

        if self.params.get('file_id') is not None:
            self.module.exit_json(msg="WARNING: file with the same name already exisit!!!", **self.result)

Unfortunately self.params.get('file_id') is == [] if is empty not "None"
This breaks file upload completely as we always say WARNING: file with the same name already exisit

There is also a typo is exist not exisit

Allow NAE Automation via Nexus Dashboard

Hi,

since Nexus Dashboard has been released api requests destined for NAE are going through the API gateway of Nexus Dashboard it's not using the ND login so far but all tasks are failing with module errors.
Please include support for NAE deployed on Nexus Dashboard. :)

Handle Gracefully double parsing an ACI Config file

When Verify == True we expect the config file to have been generated by the ansible-aci module.
If the file is already a valid ACI Config file currently we crash.

We should handle this gracefully and print a clear error

nae_delta module fails with: AttributeError: 'module' object has no attribute 'decompress'

Hi,

today I tried to do a simple test with the nae_delta module.
However I run in an issue on multiple ansible hosts with different versions.
Versions tested: 2.9.3, 2.9.12

fatal: [localhost]: FAILED! => { "changed": false, "module_stderr": "Traceback (most recent call last):\n File \"/root/.ansible/tmp/ansible-tmp-1606990806.61-7624-224921613645382/AnsiballZ_nae_delta.py\", line 102, in <module>\n _ansiballz_main()\n File \"/root/.ansible/tmp/ansible-tmp-1606990806.61-7624-224921613645382/AnsiballZ_nae_delta.py\", line 94, in _ansiballz_main\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n File \"/root/.ansible/tmp/ansible-tmp-1606990806.61-7624-224921613645382/AnsiballZ_nae_delta.py\", line 40, in invoke_module\n runpy.run_module(mod_name='ansible_collections.cisco.nae.plugins.modules.nae_delta', init_globals=None, run_name='__main__', alter_sys=True)\n File \"/usr/lib64/python2.7/runpy.py\", line 176, in run_module\n fname, loader, pkg_name)\n File \"/usr/lib64/python2.7/runpy.py\", line 82, in _run_module_code\n mod_name, mod_fname, mod_loader, pkg_name)\n File \"/usr/lib64/python2.7/runpy.py\", line 72, in _run_code\n exec code in run_globals\n File \"/tmp/ansible_cisco.nae.nae_delta_payload_f12p0D/ansible_cisco.nae.nae_delta_payload.zip/ansible_collections/cisco/nae/plugins/modules/nae_delta.py\", line 121, in <module>\n File \"/tmp/ansible_cisco.nae.nae_delta_payload_f12p0D/ansible_cisco.nae.nae_delta_payload.zip/ansible_collections/cisco/nae/plugins/modules/nae_delta.py\", line 102, in main\n File \"/tmp/ansible_cisco.nae.nae_delta_payload_f12p0D/ansible_cisco.nae.nae_delta_payload.zip/ansible_collections/cisco/nae/plugins/module_utils/nae.py\", line 1751, in new_delta_analysis\n File \"/tmp/ansible_cisco.nae.nae_delta_payload_f12p0D/ansible_cisco.nae.nae_delta_payload.zip/ansible_collections/cisco/nae/plugins/module_utils/nae.py\", line 961, in get_epochs\nAttributeError: 'module' object has no attribute 'decompress'\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1 }

The playbook looks like this:

`- name: Play 1 Check Epoch Delta
hosts: all
connection: local

tasks:

  • name: Create delta analysis from two most recent epochs
    cisco.nae.nae_delta:
    host: "{{ nae }}"
    port: 443
    username: "{{ lookup('env', 'ANSIBLE_NET_USERNAME') }}"
    password: "{{ lookup('env', 'ANSIBLE_NET_PASSWORD') }}"
    ag_name: "{{ agName }}"
    name: Delta_Analysis_1
    state: present

`

Please Advice :)

[WARNING]: Module did not set no_log for apic_password

When running the nae_ag module we should not log the APIC password

Just running the module rises the Warning.

- set_fact:
    nae_login: &nae_login
      host: "{{ inventory_hostname }}"
      username: "{{ admin_user }}"
      password: "{{ admin_pass }}"
      validate_certs: "{{ validate_certs }}"
      port: "{{ port }}"

- name: Create AG
  cisco.nae.nae_ag:
    <<: *nae_login
    name: "{{ item }}"
    state: present
  with_items:
    - "{{ ags }}"
  tags:
    - nae_config1

OUTPUT
TASK [nae : Create AG] *********************************************************************************************************************************************************************************************
ok: [192.168.66.67] => (item=Change Management)
ok: [192.168.66.67] => (item=Config Compliance)
ok: [192.168.66.67] => (item=Data Center Operations)
ok: [192.168.66.67] => (item=Epoch Analysis)
ok: [192.168.66.67] => (item=Migration)
ok: [192.168.66.67] => (item=Pre Change Verification)
ok: [192.168.66.67] => (item=Segmentation Compliance)
[WARNING]: Both option name and its alias name are set.
[WARNING]: Module did not set no_log for apic_password

resp.read() should only be called once

In NAE 5.1 any call to resp.read() after the first one, will return an empty array.
All the code should change to accomodate this.

For example this code fails

self.result['Result'] = json.loads(resp.read())['value']['data']
return json.loads(resp.read())['value']['data']

Every instance should become

r = resp.read()
self.result['Result'] = json.loads(r)['value']['data']
return json.loads(r)['value']['data']

nae_prechange fails on query state

Hi,

I got a working playbook to create and query the nae prechange analysis.
The query is working until the pre change analysis is done and when it gets the status "completed" the query is failing with following module error.

"Traceback (most recent call last):\n File "/var/lib/awx/.ansible/tmp/ansible-tmp-1607952875.8573136-10584-170220307643012/AnsiballZ_nae_prechange.py", line 102, in \n _ansiballz_main()\n File "/var/lib/awx/.ansible/tmp/ansible-tmp-1607952875.8573136-10584-170220307643012/AnsiballZ_nae_prechange.py", line 94, in _ansiballz_main\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n File "/var/lib/awx/.ansible/tmp/ansible-tmp-1607952875.8573136-10584-170220307643012/AnsiballZ_nae_prechange.py", line 40, in invoke_module\n runpy.run_module(mod_name='ansible_collections.cisco.nae.plugins.modules.nae_prechange', init_globals=None, run_name='main', alter_sys=True)\n File "/opt/rh/rh-python36/root/usr/lib64/python3.6/runpy.py", line 205, in run_module\n return _run_module_code(code, init_globals, run_name, mod_spec)\n File "/opt/rh/rh-python36/root/usr/lib64/python3.6/runpy.py", line 96, in _run_module_code\n mod_name, mod_spec, pkg_name, script_name)\n File "/opt/rh/rh-python36/root/usr/lib64/python3.6/runpy.py", line 85, in _run_code\n exec(code, run_globals)\n File "/tmp/ansible_cisco.nae.nae_prechange_payload_88bf6y31/ansible_cisco.nae.nae_prechange_payload.zip/ansible_collections/cisco/nae/plugins/modules/nae_prechange.py", line 215, in \n File "/tmp/ansible_cisco.nae.nae_prechange_payload_88bf6y31/ansible_cisco.nae.nae_prechange_payload.zip/ansible_collections/cisco/nae/plugins/modules/nae_prechange.py", line 198, in main\n File "/tmp/ansible_cisco.nae.nae_prechange_payload_88bf6y31/ansible_cisco.nae.nae_prechange_payload.zip/ansible_collections/cisco/nae/plugins/module_utils/nae.py", line 469, in get_pre_change_result\nTypeError: argument of type 'NoneType' is not iterable\n",

The playbook looks as following.

` - name: Play 1 Check Epoch Delta
hosts: all
connection: local

tasks:

- name: Query Prechange analysis
  cisco.nae.nae_prechange:
    host: "{{ nae }}"
    port: 443
    username: "{{ lookup('env', 'ANSIBLE_NET_USERNAME') }}"
    password: "{{ lookup('env', 'ANSIBLE_NET_PASSWORD') }}"
    ag_name: "{{ agName }}"
    name: NAEAnalysis
    state: query
  delegate_to: localhost

`

Please advice if I am holding it wrong :)

Nae_compliance: ability to activate/disactivate requirement_set (Expose 'active' attribute as parameter)

When you now play nae_compliance for a new requirement_set, it activates it by default on the AG and there is no possibility to only configure the set without activating it.

Since you can only have 3 sets active at the same time, it would be handy to just configure your set without activating it.

The module supported parameters are: ag_name, description, form, host, name, password, port, selector, state, username, validate_certs".

The form only contains the name and the list of requirements

{
"name": "Segmentation_Set",
"requirements": [
"Segmentation_req1",
"Segmentation_req2"
]
}

Thanks!

Documentation Issue: nae_prechange

Hi,

seems like I found an Issue in the documentation of the nae_prechange module.

image

The query NAE prechange explanation is in there twice and on the first occurrence it is stated that the state should be "verify"

Fix galaxy import warnings

Here is the current (as of v1.0.1) import warnings:

  • plugins/modules/nae_tcam.py:71:5: F841 local variable 'result' is assigned to but never used
  • plugins/modules/nae_prechange.py:207:5: F841 local variable 'result' is assigned to but never used
  • plugins/modules/nae_prechange.py:230:5: F841 local variable 'description' is assigned to but never used
  • plugins/modules/nae_prechange.py:232:5: F841 local variable 'ag_name' is assigned to but never used
  • plugins/modules/nae_delta.py:82:5: F841 local variable 'result' is assigned to but never used
  • plugins/modules/nae_delta.py:96:5: F841 local variable 'ag_name' is assigned to but never used
  • plugins/modules/nae_compliance.py:99:5: F841 local variable 'result' is assigned to but never used
  • plugins/modules/nae_compliance.py:120:5: F841 local variable 'ag_name' is assigned to but never used
  • plugins/modules/nae_compliance.py:124:5: F841 local variable 'association_to_ag' is assigned to but never used
  • plugins/modules/nae_compliance.py:125:5: F841 local variable 'active' is assigned to but never used
  • plugins/modules/nae_ag.py:113:5: F841 local variable 'result' is assigned to but never used
  • plugins/modules/nae_ag.py:133:5: F841 local variable 'description' is assigned to but never used
  • plugins/modules/nae_ag.py:137:5: F841 local variable 'apic_hostname' is assigned to but never used
  • plugins/modules/nae_ag.py:138:5: F841 local variable 'apic_username' is assigned to but never used
  • plugins/modules/nae_ag.py:139:5: F841 local variable 'apic_password' is assigned to but never used
  • plugins/modules/nae_file_management.py:89:5: F841 local variable 'result' is assigned to but never used
  • plugins/modules/nae_file_management.py:107:5: F841 local variable 'file_name' is assigned to but never used
  • plugins/modules/nae_file_management.py:108:5: F841 local variable 'name' is assigned to but never used
  • plugins/modules/nae_offline_analysis.py:90:5: F841 local variable 'result' is assigned to but never used
  • plugins/modules/nae_offline_analysis.py:111:5: F841 local variable 'file_name' is assigned to but never used
  • plugins/modules/nae_offline_analysis.py:113:5: F841 local variable 'ag_name' is assigned to but never used
  • plugins/module_utils/nae.py:37:1: F401 'base64' imported but unused
  • plugins/module_utils/nae.py:48:1: F401 'copy.deepcopy' imported but unused
  • plugins/module_utils/nae.py:49:1: F401 'ansible.module_utils.basic.AnsibleModule' imported but unused
  • plugins/module_utils/nae.py:50:1: F401 'ansible.module_utils.parsing.convert_bool.boolean' imported but unused
  • plugins/module_utils/nae.py:52:1: F401 'ansible.module_utils._text.to_bytes' imported but unused
  • plugins/module_utils/nae.py:52:1: F401 'ansible.module_utils._text.to_native' imported but unused
  • plugins/module_utils/nae.py:53:1: F401 'jsonpath_ng.jsonpath' imported but unused
  • plugins/module_utils/nae.py:402:13: F841 local variable 'json_object' is assigned to but never used
  • plugins/module_utils/nae.py:403:9: F841 local variable 'e' is assigned to but never used
  • plugins/module_utils/nae.py:872:21: F841 local variable 'prev_node' is assigned to but never used
  • plugins/module_utils/nae.py:1036:9: F841 local variable 'f' is assigned to but never used
  • plugins/module_utils/nae.py:1630:9: F841 local variable 'e' is assigned to but never used
  • plugins/module_utils/nae.py:1720:9: F841 local variable 'ioex' is assigned to but never used
  • plugins/module_utils/nae.py:1780:9: F841 local variable 'e' is assigned to but never used

Add NAE 5.0 Support for send_pre_change_payload

In NAE 5.0 the API changed slightly the pre-change analysis endpoint for file upload changed changed from:

/nae/api/v1/config-services/prechange-analysis
to
/nae/api/v1/config-services/prechange-analysis/file-changes

Also these fields in the payload are no more used:

"change_type": "CONFIG_FILE",
"changes": self.params.get('changes'),

pre_change_verification_query: Suppress Specific Smart Events

When you run a PCV query you might want to ignore specific smart events so that the task return as successful.
This could be useful specially if the module is used as part of a CICD pipeline.

A classic use case for today is that NAE PCV does not support adding a domain to an EPG and as such the APP_EPG_NOT_DEPLOYED smart event is always triggered even if the configuration is correct.

We should allow the user to specify a list of smart events to ignore.

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.