
# PeeringDB Server Development

## Models

Note: to add fk's to base models, you must add in both peeringdb.models. and in django_peeringdb.models concrete class

models.py
  - make model
  - add ref_tag_

serializers.py
  - add serializer

peeringdb/rest.py
  - make ViewSet
  - register

perms

  ALWAYS

  - on the model create a classmethod called nsp_namespace_from_id
    that should take all the ids it needs to make its namespace
    and return that namespace

    Look at the Network or NetworkContact class for examples

  - on the model create a property method called nsp_namespace
    that calls and returns __class__.nsp_namespace_from_id with
    the aproporiate ids

  - on the serializer create a method called nsp_namespace_create
    that returns the namespace to be checked for creation perms

    this method will be passed the validated serializer data so
    you can use the ids / objects in there to help build your namespace

  SOMETIMES

  - on the model create a method called nsp_has_perms_PUT that
    chould return weither or not the user has access to update
    the instance. This is needed because in some cases in order
    to update an existing object the user may need to be checked
    on perms for more than one namespace - this lets you do that

    Look at validate_PUT_ownership for helper function

  - if the model is supposed to be rendered in a list somewhere
    eg network contacts in poc_set under network make sure list
    namespacing is setup correctly - again look at Network
    and NetworkContact for examples.


## Modules

### RDAP

- Add output to parsing test

```sh
curl -L https://rdap.db.ripe.net/autnum/$ASN > tests/data/rdap/autnum/$ASN.input
```

or
```sh
scripts/rdap_getasn.sh
scripts/rdap_getent.sh
```

- Pretty print RDAP data

```sh
munge json:https://rdap.arin.net/registry/autnum/2914 yaml:
```


### Whois Server

- To locally test whois, setup `/etc/xinetd.d/pdb-whois` with similar:

```
service whois
{
        disable         = no
        socket_type     = stream
        wait            = no
        user            = $USER

        passenv =

        server          = /home/$USER/srv/dev.peeringdb.com/peeringdb/in.whoisd
        log_on_failure  = HOST
}

```

- Deploy and test against local

```sh
facs peeringdb dev --src-dir=. ; whois -h 127.0.0.1 as63311
pytest -v -rxs --cov-report term-missing --cov=peeringdb_server/ --capture=sys tests/
```

## Dependencies

All dependencies are now handled by the Pipfile.

To update them, do a pipenv lock, and test.

To update the requirements.txt file, from the base dir, run:

```sh
scripts/update_requirements_file.sh
```


## Troubleshooting

### 404 on static files with runserver:

Make sure it's in debug mode

### api tests fail

You need to specify the test directory:

```sh
pytest tests/
```

### Can't see error because of warnings

Run pytest with `-p no:warnings`

### Run one specific test

Run pytest with `-k $test_name`
