Giter Club home page Giter Club logo

operator-sdk-samples's People

Contributors

alexnpavel avatar andriisoldatenko avatar andyxning avatar asmacdo avatar bharathi-tenneti avatar camilamacedo86 avatar canghai908 avatar clyang82 avatar dfarrell07 avatar dymurray avatar estroz avatar fanminshi avatar fmoctezuma avatar geerlingguy avatar grdryn avatar gyliu513 avatar hasbro17 avatar hawky-4s- avatar hchenxa avatar huikang avatar jmrodri avatar joelanford avatar lilic avatar pratikjagrut avatar robszumski avatar theishshah avatar varshaprasad96 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

operator-sdk-samples's Issues

Helm sample operator default memory limit results in many OOMKilled restarts

I'm trying to deploy the sample operators to a variety of Kubernetes clusters, and it seems like of all the three, Helm seems to have trouble when deployed to both Kind and Minikube clusters locally.

The cluster has tons of free memory available, but the controller/manager pod keeps restarting. When I go to describe the pod, I see a lot of:

$ kubectl describe pod -n memcached-operator-system memcached-operator-controller-manager-6d57f5fd7-gfnxw
...
    Last State:     Terminated
      Reason:       OOMKilled
      Exit Code:    137
      Started:      Mon, 31 Aug 2020 16:32:42 -0500
      Finished:     Mon, 31 Aug 2020 16:33:08 -0500
    Ready:          True
    Restart Count:  1
    Limits:
      cpu:     100m
      memory:  90Mi
    Requests:
      cpu:        100m
      memory:     60Mi

And it only reconciles a one or zero CR instances before it's killed and restarts itself.

After raising the Deployment's Limits.memory to 256Mi, it seemed to work fine with no restarts.

Go operator fails during 'make deploy' with 'no matches for kind "Certificate"'

When I try to deploy the Go-based sample operator into my local kind cluster for testing, I get the following error:

unable to recognize "STDIN": no matches for kind "Certificate" in version "cert-manager.io/v1alpha2"

And here's the stdout during that same operation:

cd config/manager && /usr/local/bin/kustomize edit set image controller=ttl.sh/operator-sdk-performance-test-go:1h
/usr/local/bin/kustomize build config/default | kubectl apply -f -
namespace/memcached-operator-system created
customresourcedefinition.apiextensions.k8s.io/memcacheds.cache.example.com created
role.rbac.authorization.k8s.io/memcached-operator-leader-election-role created
clusterrole.rbac.authorization.k8s.io/memcached-operator-manager-role created
clusterrole.rbac.authorization.k8s.io/memcached-operator-proxy-role created
clusterrole.rbac.authorization.k8s.io/memcached-operator-metrics-reader created
rolebinding.rbac.authorization.k8s.io/memcached-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/memcached-operator-manager-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/memcached-operator-proxy-rolebinding created
service/memcached-operator-controller-manager-metrics-service created
service/memcached-operator-webhook-service created
deployment.apps/memcached-operator-controller-manager created
mutatingwebhookconfiguration.admissionregistration.k8s.io/memcached-operator-mutating-webhook-configuration created
validatingwebhookconfiguration.admissionregistration.k8s.io/memcached-operator-validating-webhook-configuration created

(Related: ansible-community/operator-sdk-performance-testing#1)

Include a sample with multiple APIs defined

With the latest master and the upcoming v0.1.0 version of the SDK, the SDK will support projects with multiple APIs. A sample should be created (or an existing one updated) to demonstrate how to create and use multiple APIs with the SDK.

Memcached-operator should provide an example of multiple CRD versions and a conversion webhook

With the documentation for upgrading a CRD's API version coming soon operator-framework/operator-sdk#1541 operator-framework/operator-sdk#1680 the memcached-operator should have an example of multiple api versions with a CRD manifest that uses the versions field and a conversion webhook that handles conversions between the two apiversions.

Currently blocked by the proposal for scaffolding webhooks in the SDK operator-framework/operator-sdk#1455 which is waiting on the v0.2.0 release of the controller-runtime.

Upgrade to Operator SDK 1.0.0 and tag new release?

Now that Operator SDK 1.0.0 has been released, is it possible to get the samples in this repository upgraded to that version as well? It looks like:

  • Ansible was updated here: #146
  • Helm was updated here: #139

Not sure about Go, but I didn't dig too deep through the issues/PRs. I'd like to do some comparisons now that 1.0.0 is out, but I noticed this repository's latest tag is v0.19.2 currently.

Use the same Pod labels across all three samples?

I'm trying to write some automation that works across all three of the samples (Ansible, Go, and Helm), and right now it seems Ansible and Go assign the label app=memcached to the Memcached Pods, which is nice... but the Helm operator assigns the label app.kubernetes.io/name=memcached.

Is there any particular reason for this? I have to add special cases in my code to account for the fact the Helm sample is unique—there are some other oddities too, but this is the main one that's been causing me pain.

memcached ansible error

make install 

then operator pod error:

{"level":"error","ts":1591010331.8970556,"logger":"cmd","msg":"Failed to load watches.","Namespace":"memcached","error":"role: memcached was not found","stacktrace":"github.com/go-logr/zapr.(*zapLogger).Error\n\tpkg/mod/github.com/go-logr/[email protected]/zapr.go:128\ngithub.com/operator-framework/operator-sdk/pkg/ansible.Run\n\tsrc/github.com/operator-framework/operator-sdk/pkg/ansible/run.go:124\ngithub.com/operator-framework/operator-sdk/cmd/operator-sdk/execentrypoint.newRunAnsibleCmd.func1\n\tsrc/github.com/operator-framework/operator-sdk/cmd/operator-sdk/execentrypoint/ansible.go:44\ngithub.com/spf13/cobra.(*Command).execute\n\tpkg/mod/github.com/spf13/[email protected]/command.go:826\ngithub.com/spf13/cobra.(*Command).ExecuteC\n\tpkg/mod/github.com/spf13/[email protected]/command.go:914\ngithub.com/spf13/cobra.(*Command).Execute\n\tpkg/mod/github.com/spf13/[email protected]/command.go:864\nmain.main\n\tsrc/github.com/operator-framework/operator-sdk/cmd/operator-sdk/main.go:39\nruntime.main\n\t/home/travis/.gimme/versions/go1.13.10.linux.amd64/src/runtime/proc.go:203"}
time="2020-06-01T11:18:51Z" level=fatal msg="role: memcached was not found"

Ansible Samples Not Working

At the moment, if you simply try to deploy the ansible images in the ansible directory of this repo (at least in the case of etcd and memcached), the operators do not start properly. The images should be updated and the deploy/operator.yaml files should point to the correct, working images.

valut-operator sample cannot be built

issue

Currently, valut-operator sample cannot be built.

operator-sdk version

$ operator-sdk --version
operator-sdk version v0.1.1+git

steps to produce

Just followed steps in README.

$ mkdir $GOPATH/src/github.com/operator-framework
$ cd $GOPATH/src/github.com/operator-framework
$ git clone https://github.com/operator-framework/operator-sdk-samples.git
$ cd operator-sdk-samples/vault-operator
$ operator-sdk build $IMAGE

Then, get following error.

$ operator-sdk build $IMAGE
FATA[0000] must run command in project root dir: project structure requires ./build/Dockerfile 

is the comment accurate?

Please see:

// NOTE: that the requeue is made with the purpose to provide the deployment object for the next step to ensure the deployment size is the same as the spec.

The comment indicates that the request is being re-queued in order to "to ensure the deployment size is the same as the spec" -- but is that really why the request is being re-queued? Referring to:

https://groups.google.com/forum/#!topic/operator-framework/zxlvESoMSh8

A more reasonable explanation seems to be that the request is being re-queued in order to update the status. If that's correct, then the comment should be modified to agree with the actual intent of the code.

Add reconciliation status to Go sample operator?

When I'm working with the Ansible sample operator, I get the following status data out of CRs managed by it for free:

$ kubectl describe Memcached
...
Status:
  Conditions:
    Ansible Result:
      Changed:             0
      Completion:          2020-08-27T17:29:40.270243
      Failures:            0
      Ok:                  2
      Skipped:             0
    Last Transition Time:  2020-08-27T17:29:18Z
    Message:               Awaiting next reconciliation
    Reason:                Successful
    Status:                True
    Type:                  Running

The Helm sample also provides some nice output:

Status:
  Conditions:
    Last Transition Time:  2020-08-27T20:09:14Z
    Status:                True
    Type:                  Initialized
    Last Transition Time:  2020-08-27T20:09:30Z
    Message:               Memcached can be accessed via port 11211 [...]
    Reason:  InstallSuccessful
    Status:  True
    Type:    Deployed

On the other hand, if I look at a Memcached CR that is created with the Go sample, it gives me no relevant reconciliation status data, and so I'm left to other means to try to figure out if it's ready or still reconciling. There is a Status.Node.[pod identifier] that is appended in some, but not all cases, to the data for a Memcached resource with the Go sample, but it is not obvious where in the lifecycle that is appended:

$ kubectl describe Memcached
...
Status:
  Nodes:
    memcached-756b6468d8-qqqh4

Is it possible to add some sort of reconciliation status data to the Status on the Go sample?

Helm operator sample fails during 'make deploy' with 'no matches for kind "ServiceMonitor"'

I found that in the Go sample operator, I had to install cert-manager into the cluster before deploying (see #149). For the Helm operator, I'm getting a similar error but concerning a ServiceManager:

error: unable to recognize "STDIN": no matches for kind "ServiceMonitor" in version "monitoring.coreos.com/v1"
make: *** [deploy] Error 1

I was reading through the Helm operator sample README and didn't see anywhere a mention of extra software or configuration I'd have to deploy to my cluster to be able to deploy the sample operator, but it seems like something is missing (maybe there's a ServiceMonitor set up by default in some types of clusters, like OpenShift, that aren't available in vanilla Kubernetes?).

Related: ansible-community/operator-sdk-performance-testing#1

Error when creating memcached crd

I followed the instructions for installing the memcached-operator.
When I do make install, I get the following error:

....... Applying CRDS and Operator .......
kubectl apply -f deploy/crds/cache.example.com_memcacheds_crd.yaml -n memcached
The CustomResourceDefinition "memcacheds.cache.example.com" is invalid: spec.validation.openAPIV3Schema.properties[status].properties[nodes].uniqueItems: Forbidden: uniqueItems cannot be set to true since the runtime complexity becomes quadratic

Code Refactoring

Currently, almost all the vault operational logic is under pkg/stub dir:

pkg/
├── stub
│   ├── deploy_vault.go
│   ├── handler.go
│   ├── sync_vault.go
│   ├── tls.go
│   ├── vault.go
│   └── vault_config.go
└── tls
    └── tls.go

I don't the above layout is best way to show of how an example operator should be written. It can be better if we have different pkgs that represents each of logic units, and we treat those logic units as objects. Once we have all those objects, then we can glue them together in the stub/handler.go.

We probably should start to think about the refactoring once the vault-operator is functionally complete.

cc/ @hasbro17 @spahl

Unable to run new layout project.

I am following the readme steps and then I am facing the following issues:

  • The error *** No rule to make target 'quay.io/camilamacedo86/memcached-operator:v0.0.1'. is faced when the $ make docker-build $IMG is executed.
  • The following error when make deploy $IMG is executed:
$  make deploy $IMG
/Users/camilamacedo/go/bin/controller-gen "crd:trivialVersions=true" rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=config/crd/bases
cd config/manager && kustomize edit set image controller=quay.io/camilamacedo86/memcached-operator:v0.0.1
kustomize build config/default | kubectl apply -f -
unable to recognize "STDIN": no matches for kind "Certificate" in version "cert-manager.io/v1alpha2"
unable to recognize "STDIN": no matches for kind "Issuer" in version "cert-manager.io/v1alpha2"
make: *** [Makefile:46: deploy] Error 1

cannot deploy memcachedoperator.0.0.1.csv.yaml: operator-lifecycle-manager csv in namespace with no operatorgroups

$ oc get clusterversion 
NAME      VERSION                             AVAILABLE   PROGRESSING   SINCE   STATUS
version   4.0.0-0.nightly-2019-02-26-104314   True        False         153m    Cluster version is 4.0.0-0.nightly-2019-02-26-104314

$ git clone https://github.com/operator-framework/operator-sdk-samples.git
$ cd operator-sdk-samples/memcached-operator/
$ curl -Lo memcachedoperator.0.0.1.csv.yaml https://raw.githubusercontent.com/operator-framework/getting-started/master/memcachedoperator.0.0.1.csv.yaml
$ kubectl apply -f memcachedoperator.0.0.1.csv.yaml
$ oc get csv 
NAME                       DISPLAY                 VERSION   REPLACES   PHASE
memcachedoperator.v0.0.1   Memcached Application   0.0.1                Failed

$ oc describe csv memcachedoperator.v0.0.1
Name:         memcachedoperator.v0.0.1
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"operators.coreos.com/v1alpha1","kind":"ClusterServiceVersion","metadata":{"annotations":{},"name":"memcachedoperator.v0.0.1...
API Version:  operators.coreos.com/v1alpha1
Kind:         ClusterServiceVersion
Metadata:
  Creation Timestamp:  2019-02-26T15:45:16Z
  Generation:          1
  Resource Version:    126172
  Self Link:           /apis/operators.coreos.com/v1alpha1/namespaces/default/clusterserviceversions/memcachedoperator.v0.0.1
  UID:                 831b93b3-39dd-11e9-8004-028b3db5110a
Spec:
  Customresourcedefinitions:
    Owned:
      Description:   Represents a cluster of Memcached apps
      Display Name:  Memcached App
      Kind:          Memcached
      Name:          memcacheds.cache.example.com
      Resources:
        Kind:     Deployment
        Version:  v1beta2
        Kind:     ReplicaSet
        Version:  v1beta2
        Kind:     Pod
        Version:  v1
      Spec Descriptors:
        Description:   The desired number of member Pods for the deployment.
        Display Name:  Size
        Path:          size
        X - Descriptors:
          urn:alm:descriptor:com.tectonic.ui:podCount
      Status Descriptors:
        Description:   The current status of the application.
        Display Name:  Status
        Path:          phase
        X - Descriptors:
          urn:alm:descriptor:io.kubernetes.phase
        Description:   Explanation for the current status of the application.
        Display Name:  Status Details
        Path:          reason
        X - Descriptors:
          urn:alm:descriptor:io.kubernetes.phase:reason
      Version:   v1alpha1
  Description:   Main enterprise application providing business critical features with high availabilty and no manual intervention.
  Display Name:  Memcached Application
  Install:
    Spec:
      Deployments:
        Name:  memcached-app-operator
        Spec:
          Replicas:  1
          Selector:
            Match Labels:
              App:  memcached-app-operator
          Template:
            Metadata:
              Labels:
                App:  memcached-app-operator
            Spec:
              Containers:
                Command:
                  /usr/local/bin/memcached-operator
                Image:              quay.io/jzelinskie/memcached-operator:v0.0.1
                Image Pull Policy:  Always
                Name:               sao
                Ports:
                  Container Port:                8080
                  Protocol:                      TCP
              Restart Policy:                    Always
              Service Account:                   memcached-operator
              Service Account Name:              memcached-operator
              Termination Grace Period Seconds:  5
      Permissions:
        Rules:
          API Groups:
            *
          Resources:
            *
          Verbs:
            *
        Service Account Name:  memcached-operator
    Strategy:                  deployment
  Keywords:
    memcached
    app
  Labels:
    Alm - Owner - Enterprise - App:  memcached-app-operator
    Alm - Status - Descriptors:      memcached-app-operator.v0.0.1
  Maintainers:
    Email:   [email protected]
    Name:    Some Corp
  Maturity:  alpha
  Provider:
    Name:   Example
    URL:    www.example.com
  Version:  0.0.1
Status:
  Certs Last Updated:  <nil>
  Certs Rotate At:     <nil>
  Conditions:
    Last Transition Time:  2019-02-26T15:45:16Z
    Last Update Time:      2019-02-26T15:45:16Z
    Message:               csv in namespace with no operatorgroups
    Phase:                 Failed
    Reason:                NoOperatorGroup
  Last Transition Time:    2019-02-26T15:45:16Z
  Last Update Time:        2019-02-26T15:50:28Z
  Message:                 csv in namespace with no operatorgroups
  Phase:                   Failed
  Reason:                  NoOperatorGroup
Events:
  Type     Reason           Age                From                        Message
  ----     ------           ----               ----                        -------
  Warning  NoOperatorGroup  48s (x18 over 6m)  operator-lifecycle-manager  csv in namespace with no operatorgroups


Then,

$ kubectl get ClusterServiceVersion memcachedoperator.v0.0.1 -o json | jq '.status'
{
  "certsLastUpdated": null,
  "certsRotateAt": null,
  "conditions": [
    {
      "lastTransitionTime": "2019-02-26T15:45:16Z",
      "lastUpdateTime": "2019-02-26T15:45:16Z",
      "message": "csv in namespace with no operatorgroups",
      "phase": "Failed",
      "reason": "NoOperatorGroup"
    }
  ],
  "lastTransitionTime": "2019-02-26T15:45:16Z",
  "lastUpdateTime": "2019-02-26T15:50:28Z",
  "message": "csv in namespace with no operatorgroups",
  "phase": "Failed",
  "reason": "NoOperatorGroup"
}

$ oc project default
$ kubectl create -f deploy/service_account.yaml
serviceaccount/memcached-operator created
$ kubectl create -f deploy/role.yaml
role.rbac.authorization.k8s.io/memcached-operator created
$ kubectl create -f deploy/role_binding.yaml
rolebinding.rbac.authorization.k8s.io/memcached-operator created
$ kubectl get ClusterServiceVersion memcachedoperator.v0.0.1 -o json | jq '.status'
{
  "certsLastUpdated": null,
  "certsRotateAt": null,
  "conditions": [
    {
      "lastTransitionTime": "2019-02-26T15:45:16Z",
      "lastUpdateTime": "2019-02-26T15:45:16Z",
      "message": "csv in namespace with no operatorgroups",
      "phase": "Failed",
      "reason": "NoOperatorGroup"
    }
  ],
  "lastTransitionTime": "2019-02-26T15:45:16Z",
  "lastUpdateTime": "2019-02-26T16:00:28Z",
  "message": "csv in namespace with no operatorgroups",
  "phase": "Failed",
  "reason": "NoOperatorGroup"
}

Getting 'namespaces "memcached-operator-system" not found' during make install

For example, see failed build: https://github.com/geerlingguy/operator-sdk-performance-testing/runs/1059679784?check_suite_focus=true#step:7:140

I am running this build process using Ansible, but it seems with v1.0.0 of this project, all the three sample operators—in a clean environment—seem to fail on make install due to a namespace not being created (maybe just out of order?).

Steps to Reproduce

First, go into any of the three sample operator directories. (I tested with ansible, go, and helm, all three had the same issue.)

Second, run the make routine:

export IMG=ttl.sh/operator-sdk-sample:1h
make docker-build
make docker-push
make install
make deploy

Expected Result

Everything should work (assuming you have a working Kubernetes cluster and the privileges to deploy into it).

Actual Result

stderr:

go: creating new go.mod: module tmp
go: found sigs.k8s.io/controller-tools/cmd/controller-gen in sigs.k8s.io/controller-tools v0.3.0
Error from server (NotFound): error when creating "STDIN": namespaces "memcached-operator-system" not found
Error from server (NotFound): error when creating "STDIN": namespaces "memcached-operator-system" not found
Error from server (NotFound): error when creating "STDIN": namespaces "memcached-operator-system" not found
Error from server (NotFound): error when creating "STDIN": namespaces "memcached-operator-system" not found
Error from server (NotFound): error when creating "STDIN": namespaces "memcached-operator-system" not found
Error from server (NotFound): error when creating "STDIN": namespaces "memcached-operator-system" not found
Error from server (NotFound): error when creating "STDIN": namespaces "memcached-operator-system" not found
make: *** [deploy] Error 1

stdout:

/home/runner/go/bin/controller-gen "crd:trivialVersions=true" rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=config/crd/bases
cd config/manager && /snap/bin/kustomize edit set image controller=ttl.sh/operator-sdk-performance-test-go:1h
/snap/bin/kustomize build config/default | kubectl apply -f -
namespace/system created
customresourcedefinition.apiextensions.k8s.io/memcacheds.cache.example.com configured
clusterrole.rbac.authorization.k8s.io/memcached-operator-manager-role created
clusterrole.rbac.authorization.k8s.io/memcached-operator-proxy-role created
clusterrole.rbac.authorization.k8s.io/memcached-operator-metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/memcached-operator-manager-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/memcached-operator-proxy-rolebinding created
mutatingwebhookconfiguration.admissionregistration.k8s.io/memcached-operator-mutating-webhook-configuration created
validatingwebhookconfiguration.admissionregistration.k8s.io/memcached-operator-validating-webhook-configuration created
Makefile:53: recipe for target 'deploy' failed

Integration tests failing

Running target make test-e2e is failing for all different options in there. Can someone else please confirm and let me know why this is happening?

Use same memcached image across all samples?

I noticed the Ansible and Go samples use docker.io/memcached:1.4.36-alpine, whereas the Helm sample uses memcached:1.5.20.

I am overriding the image for the Helm deployment to use the same image for comparison purposes, but it seems like it would be useful to standardize on one memcached image/version/format for all three samples.

Provide docker images for the samples

Description
Instead of we have REPLACE_IMAGE in the samples we could have the docker images which should be used with. Also, these images should be changed/tagged and pushed after each release/sample upgrade.

PS.: I think that would be helpful impl first #86

Memcached not using operator-sdk

As far as I see, memcached operator doesn't make use of operator sdk. It works on top of controller-runtime package of Kubernetes. Why is that so? If that's normal, why is that sample still in this repository?

Update sample ansible-operator projects for layout changes

After the controller-runtime refactor we changed the project layout and moved around some manifests around.
Specifically:

  • tmp/build==>build
  • deploy/rbac.yaml==> deploy/role.yaml and deploy/role_binding.yaml
  • deploy/cr.yaml and deploy/crd.yaml ==> deploy/crd/...

@dymurray @shawn-hurley We should probably update the ansible examples to be in sync with the changes on the master.

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.