Giter VIP home page Giter VIP logo

Comments (4)

kingdonb avatar kingdonb commented on June 2, 2024

Thanks for your report! I think you might be right about the source of this issue @ohkinozomu, storage differences between versions of Helm v3 in different minor releases.

Helm Operator recently had some upgrades and is on a more current Helm 3 version. We know for sure that there were some breaking changes between Helm version 3.1.2 and 3.5.4. (Those are the versions of Helm v3 that were in Helm Operator in v1.2.0 and 1.3.0, respectively.)

If you are still on Helm Operator and working on your migration, please consider upgrading to Helm Operator 1.3.0 (or 1.4.0) and trying this again. We apologize about the delay of responding to your report.

from helm-controller.

sbernheim avatar sbernheim commented on June 2, 2024

Hi @ohkinozomu, we're working through the Issues queue and just got down to your Issue today. I thought I'd ask for a bit more information in addition to @kingdonb 's response.

  1. Are you still running into this issue since you submitted this Issue in March?
    • If so, would you let us know so we can close this (and maybe your experience may help someone else?)
  2. If you still have this issue, it may be addressed in the Flux Helm Operator -> Controller migration guide. Would you mind reading through the guide and seeing if it addresses this problem?
    • Note you probably want to upgrade to the most recent version of the Flux CLI before you retry.
    • Please do let us know if there is something we can improve in the docs for your use case.

Thanks again for your feedback and for helping us test the migration process!

from helm-controller.

ohkinozomu avatar ohkinozomu commented on June 2, 2024

@sbernheim @kingdonb
Thank you for your replies.
I'll try again.

from helm-controller.

ohkinozomu avatar ohkinozomu commented on June 2, 2024

I tried.

software versions

$ kind version
kind v0.10.0 go1.15.7 darwin/amd64
$  helm version
version.BuildInfo{Version:"v3.5.3", GitCommit:"041ce5a2c17a58be0fcd5f5e16fb3e7e95fea622", GitTreeState:"dirty", GoVersion:"go1.16"}
$  kubectl version
Client Version: version.Info{Major:"1", Minor:"20+", GitVersion:"v1.20.4-dirty", GitCommit:"e87da0bd6e03ec3fea7933c4b5263d151aafd07c", GitTreeState:"dirty", BuildDate:"2021-03-15T10:03:32Z", GoVersion:"go1.16.2", Compiler:"gc", Platform:"darwin/amd64"}
$ flux -v
flux version 0.9.1

I followed my steps above and confirmed that the same error occurs.
Then, I upgraded helm-operator to 1.4.0.

$ kubectl edit deploy helm-operator -n flux
- image: docker.io/fluxcd/helm-operator:1.2.0
+ image: docker.io/fluxcd/helm-operator:1.4.0
-        - --git-timeout=20s
+        - --git-timeout=5m

I tried to migrate to helm-controller, but the same error occured.

$ kubectl scale deployment helm-operator --replicas=0 -n flux
$ kubectl apply -f strimzi-helm-controller.yaml
{"level":"info","ts":"2021-08-08T03:54:05.136Z","logger":"controller.helmrelease","msg":"HelmChart 'strimzi/strimzi-strimzi' is not ready","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"info","ts":"2021-08-08T03:54:05.156Z","logger":"controller.helmrelease","msg":"reconcilation finished in 78.5086ms, next run in 10m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"info","ts":"2021-08-08T03:54:05.163Z","logger":"controller.helmrelease","msg":"HelmChart 'strimzi/strimzi-strimzi' is not ready","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"info","ts":"2021-08-08T03:54:05.182Z","logger":"controller.helmrelease","msg":"reconcilation finished in 23.8594ms, next run in 10m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
W0808 03:54:10.907557       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 03:54:10.987822       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 03:54:11.076178       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 03:54:11.131700       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 03:54:11.209241       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 03:54:11.295695       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 03:54:11.382878       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 03:54:11.429694       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 03:54:11.527563       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 03:54:11.572522       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
{"level":"info","ts":"2021-08-08T03:54:12.247Z","logger":"controller.helmrelease","msg":"reconcilation finished in 1.8330565s, next run in 5m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"error","ts":"2021-08-08T03:54:12.247Z","logger":"controller.helmrelease","msg":"Reconciler error","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi","error":"Helm install failed: rendered manifests contain a resource that already exists. Unable to continue with install: ServiceAccount \"strimzi-cluster-operator\" in namespace \"strimzi\" exists and cannot be imported into the current release: invalid ownership metadata; label validation error: missing key \"app.kubernetes.io/managed-by\": must be set to \"Helm\"; annotation validation error: missing key \"meta.helm.sh/release-name\": must be set to \"strimzi\"; annotation validation error: missing key \"meta.helm.sh/release-namespace\": must be set to \"strimzi\""}
{"level":"info","ts":"2021-08-08T03:54:12.309Z","logger":"controller.helmrelease","msg":"reconcilation finished in 54.9509ms, next run in 5m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"error","ts":"2021-08-08T03:54:12.309Z","logger":"controller.helmrelease","msg":"Reconciler error","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi","error":"install retries exhausted"}
{"level":"info","ts":"2021-08-08T03:54:12.367Z","logger":"controller.helmrelease","msg":"reconcilation finished in 48.192ms, next run in 5m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"error","ts":"2021-08-08T03:54:12.367Z","logger":"controller.helmrelease","msg":"Reconciler error","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi","error":"install retries exhausted"}
{"level":"info","ts":"2021-08-08T03:54:12.437Z","logger":"controller.helmrelease","msg":"reconcilation finished in 48.3781ms, next run in 5m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"error","ts":"2021-08-08T03:54:12.437Z","logger":"controller.helmrelease","msg":"Reconciler error","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi","error":"install retries exhausted"}
{"level":"info","ts":"2021-08-08T03:54:12.532Z","logger":"controller.helmrelease","msg":"reconcilation finished in 54.2242ms, next run in 5m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"error","ts":"2021-08-08T03:54:12.533Z","logger":"controller.helmrelease","msg":"Reconciler error","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi","error":"install retries exhausted"}
{"level":"info","ts":"2021-08-08T03:54:12.684Z","logger":"controller.helmrelease","msg":"reconcilation finished in 70.8107ms, next run in 5m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"error","ts":"2021-08-08T03:54:12.684Z","logger":"controller.helmrelease","msg":"Reconciler error","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi","error":"install retries exhausted"}
{"level":"info","ts":"2021-08-08T03:54:12.977Z","logger":"controller.helmrelease","msg":"reconcilation finished in 131.7268ms, next run in 5m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"error","ts":"2021-08-08T03:54:12.977Z","logger":"controller.helmrelease","msg":"Reconciler error","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi","error":"install retries exhausted"}
{"level":"info","ts":"2021-08-08T03:54:13.323Z","logger":"controller.helmrelease","msg":"reconcilation finished in 25.0984ms, next run in 5m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"error","ts":"2021-08-08T03:54:13.323Z","logger":"controller.helmrelease","msg":"Reconciler error","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi","error":"install retries exhausted"}
{"level":"info","ts":"2021-08-08T03:54:13.992Z","logger":"controller.helmrelease","msg":"reconcilation finished in 28.5714ms, next run in 5m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"error","ts":"2021-08-08T03:54:13.992Z","logger":"controller.helmrelease","msg":"Reconciler error","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi","error":"install retries exhausted"}
{"level":"info","ts":"2021-08-08T03:54:15.307Z","logger":"controller.helmrelease","msg":"reconcilation finished in 33.8839ms, next run in 5m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"error","ts":"2021-08-08T03:54:15.307Z","logger":"controller.helmrelease","msg":"Reconciler error","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi","error":"install retries exhausted"}
{"level":"info","ts":"2021-08-08T03:54:17.895Z","logger":"controller.helmrelease","msg":"reconcilation finished in 28.0959ms, next run in 5m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"error","ts":"2021-08-08T03:54:17.895Z","logger":"controller.helmrelease","msg":"Reconciler error","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi","error":"install retries exhausted"}
{"level":"info","ts":"2021-08-08T03:54:23.059Z","logger":"controller.helmrelease","msg":"reconcilation finished in 43.2816ms, next run in 5m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"error","ts":"2021-08-08T03:54:23.059Z","logger":"controller.helmrelease","msg":"Reconciler error","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi","error":"install retries exhausted"}

This is natural, since the ServiceAccount does'nt have app.kubernetes.io/managed-by label with just upgrading helm-operator.

$ kubectl get sa -n strimzi strimzi-cluster-operator -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    helm.fluxcd.io/antecedent: strimzi:helmrelease/strimzi
  creationTimestamp: "2021-08-08T03:13:29Z"
  labels:
    app: strimzi
    chart: strimzi-kafka-operator-0.1.0
    component: service-account
    heritage: Helm
    release: strimzi-strimzi
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:labels:
          .: {}
          f:app: {}
          f:chart: {}
          f:component: {}
          f:heritage: {}
          f:release: {}
    manager: Go-http-client
    operation: Update
    time: "2021-08-08T03:13:29Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:secrets:
        .: {}
        k:{"name":"strimzi-cluster-operator-token-9hv27"}:
          .: {}
          f:name: {}
    manager: kube-controller-manager
    operation: Update
    time: "2021-08-08T03:13:29Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:helm.fluxcd.io/antecedent: {}
    manager: kubectl
    operation: Update
    time: "2021-08-08T03:13:30Z"
  name: strimzi-cluster-operator
  namespace: strimzi
  resourceVersion: "1645"
  selfLink: /api/v1/namespaces/strimzi/serviceaccounts/strimzi-cluster-operator
  uid: 7681ca9b-36c8-4b1a-b7e7-237219cd93ef
secrets:
- name: strimzi-cluster-operator-token-9hv27

I recreated the HelmRelease.

$ kubectl delete -f  strimzi.yaml 
$ kubectl apply -f  strimzi.yaml 

The app.kubernetes.io/managed-by label was attached.

apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    helm.fluxcd.io/antecedent: strimzi:helmrelease/strimzi
    meta.helm.sh/release-name: strimzi-strimzi
    meta.helm.sh/release-namespace: strimzi
  creationTimestamp: "2021-08-08T03:56:37Z"
  labels:
    app: strimzi
    app.kubernetes.io/managed-by: Helm
    chart: strimzi-kafka-operator-0.1.0
    component: service-account
    heritage: Helm
    release: strimzi-strimzi
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:meta.helm.sh/release-name: {}
          f:meta.helm.sh/release-namespace: {}
        f:labels:
          .: {}
          f:app: {}
          f:app.kubernetes.io/managed-by: {}
          f:chart: {}
          f:component: {}
          f:heritage: {}
          f:release: {}
    manager: Go-http-client
    operation: Update
    time: "2021-08-08T03:56:37Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:secrets:
        .: {}
        k:{"name":"strimzi-cluster-operator-token-dlrj4"}:
          .: {}
          f:name: {}
    manager: kube-controller-manager
    operation: Update
    time: "2021-08-08T03:56:37Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          f:helm.fluxcd.io/antecedent: {}
    manager: kubectl
    operation: Update
    time: "2021-08-08T03:56:38Z"
  name: strimzi-cluster-operator
  namespace: strimzi
  resourceVersion: "18671"
  selfLink: /api/v1/namespaces/strimzi/serviceaccounts/strimzi-cluster-operator
  uid: 8d1b6ea2-2a61-4596-86b3-d35d6269a12e
secrets:
- name: strimzi-cluster-operator-token-dlrj4

And I tried to migrate to helm-controller, but the new error occured.

$ kubectl scale deployment helm-operator --replicas=0 -n flux
$ kubectl apply -f strimzi-helm-controller.yaml
{"level":"error","ts":"2021-08-08T03:58:42.413Z","logger":"controller.helmrelease","msg":"Reconciler error","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi","error":"Helm install failed: rendered manifests contain a resource that already exists. Unable to continue with install: ServiceAccount \"strimzi-cluster-operator\" in namespace \"strimzi\" exists and cannot be imported into the current release: invalid ownership metadata; annotation validation error: key \"meta.helm.sh/release-name\" must equal \"strimzi\": current value is \"strimzi-strimzi\""}

I edited strimzi-helm-controller.yaml.

- releaseName: strimzi
+ releaseName: strimzi-strimzi

The migration was successful.

{"level":"info","ts":"2021-08-08T04:03:06.661Z","logger":"controller.helmrelease","msg":"HelmChart 'strimzi/strimzi-strimzi' is not ready","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"info","ts":"2021-08-08T04:03:06.681Z","logger":"controller.helmrelease","msg":"reconcilation finished in 59.3459ms, next run in 10m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"info","ts":"2021-08-08T04:03:06.683Z","logger":"controller.helmrelease","msg":"HelmChart 'strimzi/strimzi-strimzi' is not ready","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
{"level":"info","ts":"2021-08-08T04:03:06.704Z","logger":"controller.helmrelease","msg":"reconcilation finished in 22.674ms, next run in 10m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
W0808 04:03:10.804159       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 04:03:10.948836       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 04:03:11.061792       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 04:03:11.124177       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 04:03:11.168057       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 04:03:11.271869       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 04:03:11.395318       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 04:03:11.469794       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 04:03:11.625944       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
W0808 04:03:11.697401       8 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
{"level":"info","ts":"2021-08-08T04:03:48.638Z","logger":"controller.helmrelease","msg":"reconcilation finished in 38.1703817s, next run in 5m0s","reconciler group":"helm.toolkit.fluxcd.io","reconciler kind":"HelmRelease","name":"strimzi","namespace":"strimzi"}
$ kubectl get helmreleases.helm.toolkit.fluxcd.io -n strimzi
NAME      READY   STATUS                             AGE
strimzi   True    Release reconciliation succeeded   76s

From the above, I can see that one of the following is required to migrate from helm-operator v1.2.0 to helm-controller.

  1. Upgrade to helm-operator v1.4.0 (or v1.3.0) and recreate HelmRelease
  2. Manually add app.kubernetes.io/managed-by label (and meta.helm.sh/release-name annotation?) to helm resources

1 is not likely to be acceptable for some critical workloads.
2 is a lot of work.

This could be a barrier to migration.
Do you have any ideas?
helm-3.4.1 upgrade <existing release> <old charts>?

from helm-controller.

Related Issues (20)

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.