Code Monkey home page Code Monkey logo

cloudera.exe's People

Contributors

anuragpatro avatar asdaraujo avatar chaffelson avatar chusopr avatar clevesque avatar cmperro avatar curtishoward avatar guruchai avatar jimright avatar raddish18 avatar wmudge avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

cloudera.exe's Issues

auto-repo-mirror failure when Cloudera-Deploy container is CentOS Stream 8 and parcel_distro

auto-repo-mirror/task/populate_from_upstream.yml
• name: Setup System Rhel8
Fails when Cloudera-Deploy container is CentOS Stream 8 and parcel_distro: el8 cat /etc/os-release NAME="CentOS Stream" VERSION="8" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="8" PLATFORM_ID="platform:el8" PRETTY_NAME="CentOS Stream 8" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:8" HOME_URL="https://centos.org/" BUG_REPORT_URL="https://bugzilla.redhat.com/" REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux 8" REDHAT_SUPPORT_PRODUCT_VERSION="CentOS Stream"

Missing Log Location Base access policy in IDBroker Role

As per Minimal setup for cloud storage, the IDBROKER_ROLE requires two policies:

  • aws-cdp-idbroker-assume-role-policy
  • aws-cdp-log-policy

Current cloudera-deploy AWS setup here shows that the IDBroker_role only has the IDBroker Assume Role Policy and is lacking the CDP Log policy hence failing validations in cdpctl, specifically describing the actions under the aws-cdp-log-policy.

  • IdBroker role has the necessary S3 logs location actions. ❌
  • IdBroker role has the necessary S3 bucket actions. ❌

Support parameterized ARN partition for CDP policies

Receiving:

"msg": "Couldn't create policy XYZ-logs-policy: An error occurred (MalformedPolicyDocument) when calling the CreatePolicy operation: Partition \"${ARN_PARTITION}\" is not valid for resource \"arn:${ARN_PARTITION}:s3:::XYZ-ABC-DEFG\"."

Flakiness of describe-datalake in Azure causes teardown to fail

Apparently a describe-datalake operation can return a transient HTTP 500 right after a delete-datalake (at least in an Azure environment).

This can cause a teardown to fail. I manually ran a describe-datalake after the failure and it was working fine, showing the datalake with status EXTERNAL_DATABASE_DELETION_IN_PROGRESS.

The module could possibly tolerate a few 500's.

TASK [cloudera.exe.platform : Tear down CDP Datalake aa-az-dl] ********************************************************************************************************************************************************************************************************************************************************************************************************************************
Friday 25 February 2022  05:05:35 +0000 (0:00:00.125)       0:02:41.320 *******
fatal: [localhost]: FAILED! => {"changed": false, "error": "{'base_error': ClientError('An error occurred: An internal error has occurred. Retry your request, but if the problem persists, contact us with details by posting a message on the Cloudera Community forums. (Status Code: 500; Error Code: UNKNOWN; Service: datalake; Operation: describeDatalake; Request ID: 2677014e-890a-4034-8bf0-194672891ad9;)'), 'ext_traceback': ['  File \"/root/.ansible/tmp/ansible-tmp-1645765535.2918718-3248-198179142058362/AnsiballZ_datalake.py\", line 102, in <module>\\n    _ansiballz_main()\\n', '  File \"/root/.ansible/tmp/ansible-tmp-1645765535.2918718-3248-198179142058362/AnsiballZ_datalake.py\", line 94, in _ansiballz_main\\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\\n', '  File \"/root/.ansible/tmp/ansible-tmp-1645765535.2918718-3248-198179142058362/AnsiballZ_datalake.py\", line 40, in invoke_module\\n    runpy.run_module(mod_name=\\'ansible_collections.cloudera.cloud.plugins.modules.datalake\\', init_globals=None, run_name=\\'__main__\\', alter_sys=True)\\n', '  File \"/usr/lib64/python3.8/runpy.py\", line 207, in run_module\\n    return _run_module_code(code, init_globals, run_name, mod_spec)\\n', '  File \"/usr/lib64/python3.8/runpy.py\", line 97, in _run_module_code\\n    _run_code(code, mod_globals, init_globals,\\n', '  File \"/usr/lib64/python3.8/runpy.py\", line 87, in _run_code\\n    exec(code, run_globals)\\n', '  File \"/tmp/ansible_cloudera.cloud.datalake_payload_0nryc88o/ansible_cloudera.cloud.datalake_payload.zip/ansible_collections/cloudera/cloud/plugins/modules/datalake.py\", line 621, in <module>\\n', '  File \"/tmp/ansible_cloudera.cloud.datalake_payload_0nryc88o/ansible_cloudera.cloud.datalake_payload.zip/ansible_collections/cloudera/cloud/plugins/modules/datalake.py\", line 611, in main\\n', '  File \"/tmp/ansible_cloudera.cloud.datalake_payload_0nryc88o/ansible_cloudera.cloud.datalake_payload.zip/ansible_collections/cloudera/cloud/plugins/modules/datalake.py\", line 402, in __init__\\n', '  File \"/tmp/ansible_cloudera.cloud.datalake_payload_0nryc88o/ansible_cloudera.cloud.datalake_payload.zip/ansible_collections/cloudera/cloud/plugins/module_utils/cdp_common.py\", line 42, in _impl\\n    result = f(self, *args, **kwargs)\\n', '  File \"/tmp/ansible_cloudera.cloud.datalake_payload_0nryc88o/ansible_cloudera.cloud.datalake_payload.zip/ansible_collections/cloudera/cloud/plugins/modules/datalake.py\", line 469, in process\\n', '  File \"/tmp/ansible_cloudera.cloud.datalake_payload_0nryc88o/ansible_cloudera.cloud.datalake_payload.zip/ansible_collections/cloudera/cloud/plugins/modules/datalake.py\", line 520, in delete_datalake\\n', '  File \"/usr/local/lib/python3.8/site-packages/cdpy/common.py\", line 452, in wait_for_state\\n    current = describe_func(**params)\\n', '  File \"/usr/local/lib/python3.8/site-packages/cdpy/datalake.py\", line 24, in describe_datalake\\n    return self.sdk.call(\\n', '  File \"/usr/local/lib/python3.8/site-packages/cdpy/common.py\", line 559, in call\\n    parsed_err = CdpError(err)\\n'], 'error_code': 'UNKNOWN', 'violations': 'An internal error has occurred. Retry your request, but if the problem persists, contact us with details by posting a message on the Cloudera Community forums.', 'message': 'Client request error', 'status_code': '500', 'rc': 1, 'service': 'datalake', 'operation': 'describeDatalake', 'request_id': '2677014e-890a-4034-8bf0-194672891ad9'}", "msg": "Client request error", "violations": "An internal error has occurred. Retry your request, but if the problem persists, contact us with details by posting a message on the Cloudera Community forums."}

Undefined run__dw_dbc_configs causes runtime deployment to fail

if run__dw_dbc_configs is empty, run__dw_vw_configs is never set in Construct CDP DW Data Catalog configurations, which causes Check CDP DW Virtual Warehouse tags to fail.

TASK [cloudera.exe.runtime : Check CDP DW Virtual Warehouse tags] ************************************************************************************************************************************************************
task path: /opt/cldr-runner/collections/ansible_collections/cloudera/exe/roles/runtime/tasks/initialize_base.yml:229
Friday 23 December 2022  09:11:49 +0000 (0:00:00.035)       0:01:47.025 *******
The conditional check '__dw_vw_config.tags | length > 0' failed. The error was: error while evaluating conditional (__dw_vw_config.tags | length > 0): '__dw_vw_config' is undefined

The error appears to be in '/opt/cldr-runner/collections/ansible_collections/cloudera/exe/roles/runtime/tasks/initialize_base.yml': line 229, column 7, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


    - name: Check CDP DW Virtual Warehouse tags
      ^ here
fatal: [localhost]: FAILED! => {
    "msg": "'run__dw_vw_configs' is undefined"
}

Incorrect references to AWS policy documents

The data role duplicates the listing of AWS Policy documents for Cloudbreak, and is incorrect.
The policy documents URL should be moved to common and referred to in both other roles.

CDP on GCP: Error during teardown of Operational GCP Service Accounts Policies

Details

During teardown of a CDP environment on GCP, get an error when "Tear down Operational GCP Service Accounts Policies" in the platform role.

Failing Ansible Task: cloudera.exe.platform : Tear down Operational GCP Service Accounts Policies. Code link below:

- name: Tear down Operational GCP Service Accounts Policies

Error message (snippet):

{
    "changed": true,
    "stdout": "",
    "stderr": "ERROR: (gcloud.projects.remove-iam-policy-binding) Policy bindings with the specified principal and role not found!",
    "rc": 1,
    "cmd": [
        "gcloud",
        "projects",
        "remove-iam-policy-binding",
        "<GCP_PROJECT>",
        "--member=serviceAccount:jegcpt-logs-identity@<GCP_PROJECT>.iam.gserviceaccount.com",
        "--role=projects/<GCP_PROJECT>/roles/jegcpt_logs_role",
        "--all"
    ],
    "start": "2022-02-24 16:50:01.181110",
    "end": "2022-02-24 16:50:03.351317",
    "delta": "0:00:02.170207",
    "msg": "non-zero return code",
    "invocation": {
        "module_args": {
            "_raw_params": "gcloud projects remove-iam-policy-binding <GCP_PROJECT> --member=serviceAccount:jegcpt-logs-identity@<GCP_PROJECT>.iam.gserviceaccount.com --role=projects/<GCP_PROJECT>/roles/jegcpt_logs_role --all\n",
            "warn": true,
            "_uses_shell": false,
            "stdin_add_newline": true,
            "strip_empty_ends": true,
            "argv": null,
            "chdir": null,
            "executable": null,
            "creates": null,
            "removes": null,
            "stdin": null
        }
    },
    "stdout_lines": [],
    "stderr_lines": [
        "ERROR: (gcloud.projects.remove-iam-policy-binding) Policy bindings with the specified principal and role not found!"
    ],
    "_ansible_no_log": false,
    "failed_when_result": true,
    "__gcp_binding_item": {
        "member": "serviceAccount:jegcpt-logs-identity@<GCP_PROJECT>.iam.gserviceaccount.com",
        "role": "projects/<GCP_PROJECT>/roles/jegcpt_logs_role"
    },
    "ansible_loop_var": "__gcp_binding_item",
    "_ansible_item_label": "__gcp_binding_item.member"
}

Reason for error

This tasks attempts to remove GCP IAM role & policy bindings from the their associated service accounts. However these service accounts have already been removed in a previous task (L54-L66 Tear down Operational GCP Service Accounts)

Possible Solution

I believe this is just an ordering problem - iam-policy-bindings should be removed before deleting the Service Accounts so that they can still be referenced in the gcloud projects remove-iam-policy-binding command.

Task to delete GCP Service Accounts Policies fails when SA doesn't exist

Details

The task which removes GCP Service Account policies task which uses a gcloud command now fails when the Service Account does not exist. There is a failed_when condition on this task which should prevent this happending:

- name: Tear down Operational GCP Service Accounts Policies
when: plat__teardown_deletes_policies
register: __gcp_service_account_teardown
loop_control:
loop_var: __gcp_binding_item
label: __gcp_binding_item.member
failed_when:
- __gcp_service_account_teardown.rc == 1
- "'Policy bindings with the specified member and role not found!' not in __gcp_service_account_teardown.stderr"

This task uses the gcloud projects remove-iam-policy-binding command and it seems the the error message for a non-existent SA has changed slightly:

cldr full-v1.5.4 #> gcloud projects remove-iam-policy-binding <GCP_ACCOUNT> --member=serviceAccount:jenright-audit-identity@<GCP_ACCOUNT>.iam.gserviceaccount.com --role=roles/storage.objectAdmin --all
ERROR: (gcloud.projects.remove-iam-policy-binding) Policy bindings with the specified principal and role not found!

Possible Solution

Change the failed_when condition on the Tear down Operational GCP Service Accounts Policies to catch the new error message.

"${ARN_PARTITION}" needs to be replaced with "aws" (or equivalent) in several AWS IAM policies

Several of the AWS IAM policies published under the public cloudbreak repository now have "${ARN_PARTITION}" replacement prompts included in their Resource references. For example,

"Resource": "arn:aws:s3:::${DATALAKE_BUCKET}"

has been replaced with

"Resource": "arn:${ARN_PARTITION}:s3:::${DATALAKE_BUCKET}"

(I believe this change is related to work required to support GovCloud. )

As a result, environment deployment attempts have started failing with errors like the following:

TASK [cloudera.exe.platform : Create CDP Data Access Policies] *************************************************************************************************************************************************************
Wednesday 11 May 2022  22:53:56 +0000 (0:00:01.692)       0:05:02.625 ********* 
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: botocore.errorfactory.MalformedPolicyDocumentException: An error occurred (MalformedPolicyDocument) when calling the CreatePolicy operation: Partition "${ARN_PARTITION}" is not valid for resource "arn:${ARN_PARTITION}:s3:::sup-rp-uet2".
failed: [localhost] (item=sup-rp-logs-policy) => {"__aws_policy_details_item": {"description": "CDP Log Location Access", "key": "log", "name": "sup-rp-logs-policy"}, "ansible_loop_var": "__aws_policy_details_item", "boto3_version": "1.21.40", "botocore_version": "1.24.40", "changed": false, "error": {"code": "MalformedPolicyDocument", "message": "Partition \"${ARN_PARTITION}\" is not valid for resource \"arn:${ARN_PARTITION}:s3:::sup-rp-uet2\".", "type": "Sender"}, "msg": "Couldn't create policy sup-rp-logs-policy: An error occurred (MalformedPolicyDocument) when calling the CreatePolicy operation: Partition \"${ARN_PARTITION}\" is not valid for resource \"arn:${ARN_PARTITION}:s3:::sup-rp-uet2\".", "response_metadata": {"http_headers": {"connection": "close", "content-length": "370", "content-type": "text/xml", "date": "Wed, 11 May 2022 22:54:05 GMT", "x-amzn-requestid": "6d5d6b50-3917-479b-92c6-81618857a0ea"}, "http_status_code": 400, "request_id": "6d5d6b50-3917-479b-92c6-81618857a0ea", "retry_attempts": 0}}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: botocore.errorfactory.MalformedPolicyDocumentException: An error occurred (MalformedPolicyDocument) when calling the CreatePolicy operation: Partition "${ARN_PARTITION}" is not valid for resource "arn:${ARN_PARTITION}:s3:::sup-rp-uet2/ranger/audit/*".
failed: [localhost] (item=sup-rp-audit-policy) => {"__aws_policy_details_item": {"description": "CDP Ranger Audit S3 Access", "key": "ranger_audit_s3", "name": "sup-rp-audit-policy"}, "ansible_loop_var": "__aws_policy_details_item", "boto3_version": "1.21.40", "botocore_version": "1.24.40", "changed": false, "error": {"code": "MalformedPolicyDocument", "message": "Partition \"${ARN_PARTITION}\" is not valid for resource \"arn:${ARN_PARTITION}:s3:::sup-rp-uet2/ranger/audit/*\".", "type": "Sender"}, "msg": "Couldn't create policy sup-rp-audit-policy: An error occurred (MalformedPolicyDocument) when calling the CreatePolicy operation: Partition \"${ARN_PARTITION}\" is not valid for resource \"arn:${ARN_PARTITION}:s3:::sup-rp-uet2/ranger/audit/*\".", "response_metadata": {"http_headers": {"connection": "close", "content-length": "385", "content-type": "text/xml", "date": "Wed, 11 May 2022 22:54:12 GMT", "x-amzn-requestid": "483671df-ad62-48b8-9c53-bcb7a5c44714"}, "http_status_code": 400, "request_id": "483671df-ad62-48b8-9c53-bcb7a5c44714", "retry_attempts": 0}}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: botocore.errorfactory.MalformedPolicyDocumentException: An error occurred (MalformedPolicyDocument) when calling the CreatePolicy operation: Partition "${ARN_PARTITION}" is not valid for resource "arn:${ARN_PARTITION}:s3:::sup-rp-uet2".
failed: [localhost] (item=sup-rp-dladmin-policy) => {"__aws_policy_details_item": {"description": "CDP Datalake Admin S3 Access", "key": "datalake_admin_s3", "name": "sup-rp-dladmin-policy"}, "ansible_loop_var": "__aws_policy_details_item", "boto3_version": "1.21.40", "botocore_version": "1.24.40", "changed": false, "error": {"code": "MalformedPolicyDocument", "message": "Partition \"${ARN_PARTITION}\" is not valid for resource \"arn:${ARN_PARTITION}:s3:::sup-rp-uet2\".", "type": "Sender"}, "msg": "Couldn't create policy sup-rp-dladmin-policy: An error occurred (MalformedPolicyDocument) when calling the CreatePolicy operation: Partition \"${ARN_PARTITION}\" is not valid for resource \"arn:${ARN_PARTITION}:s3:::sup-rp-uet2\".", "response_metadata": {"http_headers": {"connection": "close", "content-length": "370", "content-type": "text/xml", "date": "Wed, 11 May 2022 22:54:20 GMT", "x-amzn-requestid": "06e9eb59-961e-4645-a0fa-3367f4b5132d"}, "http_status_code": 400, "request_id": "06e9eb59-961e-4645-a0fa-3367f4b5132d", "retry_attempts": 0}}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: botocore.errorfactory.MalformedPolicyDocumentException: An error occurred (MalformedPolicyDocument) when calling the CreatePolicy operation: Partition "${ARN_PARTITION}" is not valid for resource "arn:${ARN_PARTITION}:s3:::sup-rp-uet2".
failed: [localhost] (item=sup-rp-storage-policy) => {"__aws_policy_details_item": {"description": "CDP Bucket S3 Access", "key": "bucket_access", "name": "sup-rp-storage-policy"}, "ansible_loop_var": "__aws_policy_details_item", "boto3_version": "1.21.40", "botocore_version": "1.24.40", "changed": false, "error": {"code": "MalformedPolicyDocument", "message": "Partition \"${ARN_PARTITION}\" is not valid for resource \"arn:${ARN_PARTITION}:s3:::sup-rp-uet2\".", "type": "Sender"}, "msg": "Couldn't create policy sup-rp-storage-policy: An error occurred (MalformedPolicyDocument) when calling the CreatePolicy operation: Partition \"${ARN_PARTITION}\" is not valid for resource \"arn:${ARN_PARTITION}:s3:::sup-rp-uet2\".", "response_metadata": {"http_headers": {"connection": "close", "content-length": "370", "content-type": "text/xml", "date": "Wed, 11 May 2022 22:54:26 GMT", "x-amzn-requestid": "d992095d-cf39-42d9-9ed0-3d5f4af3ee53"}, "http_status_code": 400, "request_id": "d992095d-cf39-42d9-9ed0-3d5f4af3ee53", "retry_attempts": 0}}

PLAY RECAP *****************************************************************************************************************************************************************************************************************
localhost                  : ok=212  changed=32   unreachable=0    failed=1    skipped=152  rescued=0    ignored=0   

It will be necessary to replace "${ARN_PARTITION}" with "aws" (or a GovCloud equivalent).

I found that replacement tag in the following IAM policy templates:
aws-cdp-ranger-audit-s3-policy.json
aws-cdp-datalake-admin-s3-policy.json
aws-cdp-bucket-access-policy.json
aws-cdp-dynamodb-policy.json (although this one can probably be ignored)
aws-cdp-log-policy.json

Azure Authz missing a role assignation to the Audit Role -> Failed Provisioning

Details

Trying to deploy an Azure environment is failing due to a missing Role Assignation that should be added at the setup_azure_authz.yml task in the Platform role. The Audit role needs access to the Log container.

Missing Role:

-   role: "{{ __azure_storageblobdata_ctrb_role_id }}"
    scope: "{{ plat__azure_logpath_uri }}"
    assignee: "{{ __azure_ranger_audit_identity.properties.principalId }}"

- role: "{{ __azure_storageblobdata_ctrb_role_id }}"
scope: "{{ plat__azure_datapath_uri }}"
assignee: "{{ __azure_ranger_audit_identity.properties.principalId }}"
desc: Assign Storage Blob Data Contributor Role to Ranger Audit Role at Data Container level

Variable security_group_vpce_name used a literal in setup_aws_network.yml (infra role)

Details

There is a minor bug in the setup_aws_network.yml task file of cloudera.exe.infrastructure where infra__security_group_vpce_name is used as a literal string instead of as a variable:

tags: "{{ infra__tags | combine({ 'Name': 'infra__security_group_vpce_name' }, recursive=True) }}"

This causes the AWS VPC Endpoint Security Group Name tag to have a value of infra__security_group_vpce_name.

Possible Solution

Remove quotes around infra__security_group_vpce_name in Line 256 of above file - i.e.

This code:

tags: "{{ infra__tags | combine({ 'Name': 'infra__security_group_vpce_name' }, recursive=True) }}"

Becomes:

tags: "{{ infra__tags | combine({ 'Name': infra__security_group_vpce_name }, recursive=True) }}"

Deployment failure on CDP Control Plane regions other than us-west-1

Details

When running Cloudera-Deploy to create an environment on the eu-1 CDP tenant the error below occurs in the platform role.

Failing Ansible Task: cloudera.exe.platform: Create CDP Admin group

Error message (snippet):

fatal: [localhost]: FAILED! => {"changed": false, "error": "{'base_error': ClientError(\"An error occurred: Role 'crn:altus:iam:us-west-1:altus:role:EnvironmentAdmin' does not exist in the account 'altus' (Status Code: 404; Error Code: NOT_FOUND; Service: iam; Operation: assignGroupRole; Request ID: ;)\"),  "msg": "Client request error", "violations": "Role 'crn:altus:iam:us-west-1:altus:role:EnvironmentAdmin' does not exist in the account 'altus'"}

Reason for error

Debugging the error we found that the CRN of resources in the eu-1 CDP tenant are different and a prefixed with crn:altus:iam:eu-1:altus instead of crn:altus:iam:us-west-1:altus. Example from cdpcli is shown below:

# Get list of role
$ cdp --profile prod_eu-1 iam list-roles | grep Environ
cdp --profile prod_eu-1 iam list-roles | grep Environ
            "crn": "crn:altus:iam:eu-1:altus:role:EnvironmentAdmin",
                    "crn": "crn:altus:iam:eu-1:altus:policy:EnvironmentAdminPolicy",
            "crn": "crn:altus:iam:eu-1:altus:role:EnvironmentCreator",
                    "crn": "crn:altus:iam:eu-1:altus:policy:EnvironmentCreatorPolicy",
                                "environments/createEnvironment",
            "crn": "crn:altus:iam:eu-1:altus:role:EnvironmentUser",
                    "crn": "crn:altus:iam:eu-1:altus:policy:EnvironmentUserPolicy",

Tracing the us-west-1 CRN string in the code we found that the CRN namespace is hard-coded in the variables file of the platform role:

namespace: "crn:altus:iam:us-west-1:altus"

Possible Solution

Allow the CDP Control Plane Region to be selected via globals. This can be optional, allowing a default as us-west-1.

Create variables/defaults in common for the CDP Control Plane Region and CRN - these can take the value of the global.cdp_region if specified. Use these variables in any roles where the CDP region or crn is required.

Tags not implemented in many documented areas

Many parts of the configuration.yml documentation state that the user may supply tags for individual components and expect them to be applied, except they are not implemented in the Framework. It appears that mostly we generate common infra tags and apply to them to all infra where possible. This should either be implemented or the documentation corrected.

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.